我正在尝试比较两个xml文件:
$ cat input.xml
<rootnode>
<section id="1" >
<outer param="p1" >
<inner />
<inner />
</outer>
<outer >
<inner />
</outer>
<outer />
<outer />
</section>
<section id="2" >
<outer >
<inner />
<inner />
<inner />
</outer>
</section>
<section id="3" >
<outer >
<inner />
</outer>
</section>
<section id="7" >
<outer >
<inner />
</outer>
</section>
</rootnode>
另一个文件是:
$ cat result.xml
<rootnode>
<section id="1" status="fail">
<outer param="p1" status="fail">
<inner status="fail"/>
<inner status="pass"/>
</outer>
<outer status="pass">
<inner status="pass"/>
</outer>
<outer status="pass"/>
<outer status="fail"/>
</section>
<section id="2" status="fail">
<outer status="fail">
<inner status="pass"/>
<inner status="fail"/>
<inner status="inc"/>
</outer>
</section>
<section id="5" status="pass">
<outer status="pass">
<inner status="pass"/>
</outer>
</section>
<section id="6" status="inc">
<outer status="inc">
<inner status="inc"/>
</outer>
</section>
</rootnode>
我想打印<section>
中不属于input.xml
的{{1}}个节点。可以通过result.xml
属性唯一标识节点。
我试过这个XSLT文件:
id
但是,这只返回id值。我需要整个节节点。
我只是在$ cat missing.xsl
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:param name="doc" select="document('result.xml')"/>
<xsl:template match="/">
<xsl:variable name="var" select="$doc/rootnode/section" />
<root>
<xsl:for-each select="//section/@id[not(. = $var/@id)] ">
<missing><xsl:value-of select="."/></missing>
</xsl:for-each>
</root>
</xsl:template>
</xsl:stylesheet>
中使用了错误的xpath,还是我的方法存在根本缺陷?
PS:解决方案应该在XSLT 1.0中。
答案 0 :(得分:1)
您目前正在选择@id
属性,而不是section
元素本身,因此xsl:value-of
只会获取该属性的值。
只需将select
表达式更改为选择section
元素,然后将@id
移至条件
<xsl:for-each select="//section[not(@id = $var/@id)] ">
<missing><xsl:copy-of select="."/></missing>
</xsl:for-each>
请注意使用xsl:copy-of
复制section
元素。 xsl:value-of
用于获取节点的字符串值,而不是节点本身。