1

下面给出了两个示例 xml:

xml1:

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

xml2:

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

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

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

如何用 xslt 完成?

4

2 回答 2

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>
于 2013-09-16T11:20:10.883 回答
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>
于 2013-09-16T12:33:06.970 回答