我有以下输入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>
如果<case>
下<RMEM>
标签的值与<folder>
下<FOLDERID>
标签的值匹配,我必须将/ROOT/AWD
下的事例移动到/ROOT/PQContact/input
的<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>
考虑使用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标识模板相结合,那么唯一需要的就是一个模板来确保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>