下面给出了两个样本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完成?
答案 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>