XSLT:从两个xml输出不匹配的元素

时间:2013-09-16 09:47:15

标签: xslt

下面给出了两个样本xmls:

XML1:

<Root>
  <Child1/>
  <Child2/>
  <Child3/>
</Root>

XML2:

<Root>
  <Child0>xml2value</Child0>
  <Child2/>
  <Child3>xml2value</Child3>
  <Child4>xml2value</Child4>
</Root>

我在两个变量中得到了这两个xmls。现在我想从xml2中过滤掉xml1中不存在的那些元素,即生成的变量应如下所示:

<Child0>xml2value</Child0>
<Child4>xml2value</Child4>

如何使用xslt完成?

2 个答案:

答案 0 :(得分:2)

XSLT 2.0:

<xsl:key name="el-by-name" match="Root/*" use="node-name(.)"/>

<xsl:variable name="xml1" select="document('file1.xml')"/>
<xsl:variable name="xml2" select="document('file2.xml')"/>

<xsl:copy-of select="$xml2/Root/*[not(key('el-by-name', node-name(.), $xml1))]"/>

使用XSLT 1.0:

<xsl:key name="el-by-name" match="Root/*" use="name()"/>

<xsl:variable name="xml1" select="document('file1.xml')"/>
<xsl:variable name="xml2" select="document('file2.xml')"/>

<xsl:for-each select="$xml2/Root/*">
  <xsl:variable name="child" select="."/>
  <xsl:for-each select="$xml1">
    <xsl:if test="not(key('el-by-name', name($child)))">
      <xsl:copy-of select="$child"/>
    </xsl:if>
  </xsl:for-each>
</xsl:for-each>

答案 1 :(得分:0)

我用以下代码解决了这个问题:

               <xsl:variable name="output">
                <xsl:for-each select="$xml2/Root/*">
                  <xsl:variable name="cur" select="local-name(.)"/>
                  <xsl:if test="not($xml1/Root/*[local-name(.)=$cur])">
                    <xsl:copy-of select="."/>
                  </xsl:if>
                </xsl:for-each>
               </xsl:variable>