基于匹配值移动节点



我有以下输入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>

相关内容

  • 没有找到相关文章