XSLT:比较两个文件和列表



我正在尝试比较两个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用于获取节点的字符串值,而不是节点本身。

相关内容

  • 没有找到相关文章

最新更新