2016-04-12 56 views
0

我有以下输入XML:移动节点

<?xml version="1.0" encoding="UTF-8"?> 
<ROOT> 
    <PQContact> 
     <input> 
     <folder> 
      <UNITCD>CS2XAA</UNITCD> 
      <FOLDERID>KKMTEST3000</FOLDERID> 
     </folder> 
     </input> 
     <input> 
     <folder> 
      <UNITCD>CS2XAA</UNITCD> 
      <FOLDERID>KKMTEST1300</FOLDERID> 
     </folder> 
     </input> 
    </PQContact> 
    <AWD> 
     <case> 
     <RMEM>KKMTEST3000</RMEM> 
     <transaction>ABC</transaction> 
     </case> 
     <case> 
     <RMEM>KKMTEST1300</RMEM> 
     <transaction>DEF</transaction> 
     </case> 
    </AWD> 
</ROOT> 

我不得不/ROOT/AWD下移动情况下的/ROOT/PQContact/input<folder>如果<RMEM>标签下<case>匹配值与<FOLDERID>值标签<folder>

我生成的XML应该如下:

<?xml version="1.0" encoding="UTF-8"?> 
<ROOT> 
    <PQContact> 
     <input> 
     <folder> 
      <UNITCD>CS2XAA</UNITCD> 
      <FOLDERID>KKMTEST3000</FOLDERID> 
      <case> 
       <RMEM>KKMTEST3000</RMEM> 
       <transaction>ABC</transaction> 
      </case> 
     </folder> 
     </input> 
     <input> 
     <folder> 
      <UNITCD>CS2XAA</UNITCD> 
      <FOLDERID>KKMTEST1300</FOLDERID> 
      <case> 
       <RMEM>KKMTEST1300</RMEM> 
       <transaction>DEF</transaction> 
      </case> 
     </folder> 
     </input> 
    </PQContact> 
    <AWD /> 
</ROOT> 

回答

1

考虑使用xsl:key来查找case元素:

<xsl:key name="case" match="case" use="RMEM" /> 

然后,你可以拥有的folder元素相匹配的模板复制现有节点,但也使用密钥复制匹配的case元素。

<xsl:template match="folder"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*|node()"/> 
    <xsl:apply-templates select="key('case', FOLDERID)" /> 
    </xsl:copy> 
</xsl:template> 

XSLT identity template结合这一点,那么所需要的仅仅是一个模板,以确保AWD不被复制了。

试试这个XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:key name="case" match="case" use="RMEM" /> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="folder"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     <xsl:apply-templates select="key('case', FOLDERID)" /> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="AWD" /> 
</xsl:stylesheet>