我正在尝试比较两个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>
我想打印input.xml
中不在result.xml
中的<section>
节点。节点可以通过其id
属性唯一标识。我试过这个XSLT文件:
$ 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>
但是,只返回id值。我需要整个section节点。是我在<xsl:value-of select="."/>
中使用了错误的xpath,还是我的方法存在根本缺陷?
PS:解决方案应该在XSLT 1.0中。
您当前选择的是@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
用于获取节点的字符串值,而不是节点本身。