在XSL中匹配并显示缺少的节点

时间:2014-02-13 22:54:04

标签: xml xslt xpath xslt-1.0

我必须将一组节点与另一组节点相匹配,以查看哪一个节点丢失。当它丢失时,我需要显示缺失节点的名称。只能使用XSLv1.0。

XML:

<root>
  <ph>
    <wb>full_list</wb>
      <wbs>
        <categories>
          <rule>
            <name>Intimate Clothing</name>
            <value>95</value>
            <allow/>
            <log>true</log>
          </rule>
          <rule>
            <name>Books</name>
            <value>825</value>
            <allow/>
            <log>true</log>
          </rule>
          <rule>
            <name>Violence</name>
            <value>93</value>
            <allow/>
            <log>true</log>
          </rule>
      </categories>
    </wbs>
  </ph>
          ... hundreds of lines later ...
  <ph>
    <wb>items</wb>
      <wbs>
        <categories>
          <rule>
            <value>93</value>
            <allow/>
            <log>true</log>
          </rule>
          <rule>
            <value>95</value>
            <allow/>
          <log>true</log>
        </rule>
      </categories>
    </wbs>
  </ph>
</root>

期望的结果:

Books&lt; - 因为“Books”是两组节点中缺少的一个(或“825”值)。

我有的XSL:

    <xsl:variable name="ph" select="root/ph"/>

    <xsl:for-each select="$ph[wb = 'full_list']/wbs/categories/rule[value != $ph[wb = 'items']/wbs/categories/rule/value]">
        <xsl:value-of select="name"/>
    </xsl:for-each>

但这最终会显示<name>上的每个full_list。它应该只显示“书籍”。我做错了什么?

1 个答案:

答案 0 :(得分:1)

您的方法不起作用的原因是您使用的是node[child!=node-set]而不是node[not(child=node-set)]。第一个结构说“每个节点至少有一个子节点与某些节点集成员”不匹配;第二个说“每个没有孩子的节点匹配任何节点集成员”。

我重复建议使用密钥,这样可以更有效地找到“相关”项目。