2016-11-21 93 views
0

我有必要根据XSLT需要合并在XSLT 2 XML基于公共密钥

变量1一个共同的关键,​​合并2个源变量:我添加一些属性为每个员工。

<EmpDetails> 
<Emp> 
<ID>1</ID> 
<Name>A</Name> 
<Address>abc 123</Address> 
<Contact>1234567890</Contact> 
<DOB>01/01/1989</DOB> 
<Emp> 
<Emp> 
    <ID>2</ID> 
    <Name>B</Name> 
    <Address>ASDF</Address> 
    <Contact>123456</Contact> 
    <DOB>02/02/1990</DOB> 
    <Emp> 
    </EmpDetails> 

变量2:

<EmpAgeDetails> 
<EmpAge> 
    <ID>1</ID> 
    <Age>27</Age> 
    <EmpAge> 
    <EmpAge> 
    <ID>2</ID> 
    <Age>26</Age> 
    <EmpAge> 
</EmpAgeDetails> 

预期输出:

<EmpDetails> 
<Emp> 
    <ID>1</ID> 
    <Name>A</Name> 
    <Address>abc 123</Address> 
    <Contact>1234567890</Contact> 
    <DOB>01/01/1989</DOB> 
    <Age>27</Age> 
    <Emp> 
    <Emp> 
     <ID>2</ID> 
     <Name>B</Name> 
     <Address>ASDF</Address> 
     <Contact>123456</Contact> 
     <DOB>02/02/1990</DOB> 
     <Age>26</Age> 
    <Emp> 
     </EmpDetails> 

我使用模板来复制从变量1,其工作正常的所有元素。 但现在我需要合并Age的额外元素。 任何帮助表示赞赏

+1

哪个XSLT处理器,您可以使用哪种XSLT版本? –

回答

0

使用XSLT 3.0和xsl:merge,作为最新支持的Altova的XMLSpy /猛禽或撒克逊9.7 EE,你可以使用

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fn="http://www.w3.org/2005/xpath-functions" xmlns:math="http://www.w3.org/2005/xpath-functions/math" xmlns:array="http://www.w3.org/2005/xpath-functions/array" xmlns:map="http://www.w3.org/2005/xpath-functions/map" exclude-result-prefixes="array fn map math xs"> 

    <xsl:mode on-no-match="shallow-copy"/> 

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 

    <xsl:param name="doc1"> 
     <EmpDetails> 
      <Emp> 
       <ID>1</ID> 
       <Name>A</Name> 
       <Address>abc 123</Address> 
       <Contact>1234567890</Contact> 
       <DOB>01/01/1989</DOB> 
      </Emp> 
      <Emp> 
       <ID>2</ID> 
       <Name>B</Name> 
       <Address>ASDF</Address> 
       <Contact>123456</Contact> 
       <DOB>02/02/1990</DOB> 
      </Emp> 
     </EmpDetails> 
    </xsl:param> 

    <xsl:param name="doc2"> 
     <EmpAgeDetails> 
      <EmpAge> 
       <ID>1</ID> 
       <Age>27</Age> 
      </EmpAge> 
      <EmpAge> 
       <ID>2</ID> 
       <Age>26</Age> 
      </EmpAge> 
     </EmpAgeDetails> 
    </xsl:param> 

    <xsl:template match="/" name="xsl:initial-template"> 
     <EmpDetails> 
      <xsl:merge> 
       <xsl:merge-source select="$doc1/EmpDetails/Emp"> 
        <xsl:merge-key select="ID"></xsl:merge-key> 
       </xsl:merge-source> 
       <xsl:merge-source select="$doc2/EmpAgeDetails/EmpAge"> 
        <xsl:merge-key select="ID"></xsl:merge-key> 
       </xsl:merge-source> 
       <xsl:merge-action> 
        <xsl:copy> 
         <xsl:apply-templates select="current-merge-group()[1]/*, fn:current-merge-group()[2]/Age"/> 
        </xsl:copy> 
       </xsl:merge-action> 
      </xsl:merge>   
     </EmpDetails> 

    </xsl:template> 

</xsl:stylesheet> 

使用XSLT 2.0你可以组:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:output method="xml" indent="yes"/> 

    <xsl:param name="doc1"> 
     <EmpDetails> 
      <Emp> 
       <ID>1</ID> 
       <Name>A</Name> 
       <Address>abc 123</Address> 
       <Contact>1234567890</Contact> 
       <DOB>01/01/1989</DOB> 
      </Emp> 
      <Emp> 
       <ID>2</ID> 
       <Name>B</Name> 
       <Address>ASDF</Address> 
       <Contact>123456</Contact> 
       <DOB>02/02/1990</DOB> 
      </Emp> 
     </EmpDetails> 
    </xsl:param> 

    <xsl:param name="doc2"> 
     <EmpAgeDetails> 
      <EmpAge> 
       <ID>1</ID> 
       <Age>27</Age> 
      </EmpAge> 
      <EmpAge> 
       <ID>2</ID> 
       <Age>26</Age> 
      </EmpAge> 
     </EmpAgeDetails> 
    </xsl:param> 

    <xsl:template match="/" name="main"> 
     <EmpDetails> 
      <xsl:for-each-group select="$doc1/EmpDetails/Emp, $doc2/EmpAgeDetails/EmpAge" group-by="ID"> 
       <xsl:copy> 
        <xsl:copy-of select="current-group()[1]/*, current-group()[2]/Age"/> 
       </xsl:copy> 
      </xsl:for-each-group>   
     </EmpDetails> 
    </xsl:template> 

</xsl:stylesheet> 
+0

嘿..谢谢你的回复。我正试图在Jdeveloper 12c中实现这一点。并且我定义了与变量1类似的输出变量,只有1个额外的元素用于年龄。我不知道这是否会在我的情况下工作 –

+0

嘿..感谢您的答复。我正试图在Jdeveloper 12c中实现这一点。并且我定义了与变量1类似的输出变量,只有1个额外的元素用于年龄。因此,要将变量1中的所有数据复制到输出变量,我使用以下模板 \t不确定如何应用您在我的案例中给出的模板 –