XSLT:检查一个节点集中的值是否存在于另一个节点集中



所以,我有两个变量,每个变量包含一个节点集(A和B(。我需要对节点集 B 中的行进行计数,而节点集 A 中存在@id行。

这是否可能,如果是这样,我不确定如何在 xslt 1.0 中编写此 xpath?

<xsl:value-of select="count($B[])"/>

从您的问题中不清楚这是否是您需要的。 也就是说,这种问题并不少见。

假设数据如下:

<?xml version="1.0" encoding="utf-8"?>
<test>
<nodeset_a>
<item id="1"/>
<item id="2"/>
<item id="3"/>
<item id="4"/>
<item id="2"/>
</nodeset_a>
<nodeset_b>
<item id="1"/>
<item id="4"/>
<item id="5"/>
<item id="6"/>
<item id="7"/>
</nodeset_b>
</test>

您的问题听起来像您想计算nodeset_b中有多少项目具有与nodeset_a中的id值匹配的id值。 以下表达式将生成正确的计数:

<xsl:value-of select="count(/test/nodeset_b/item[@id = /test/nodeset_a/item/@id])"/>

更新 - 否定

相反的情况可能有点棘手 - 在nodeset_b中查找具有id值且nodeset_a中没有匹配id值的项目。

乍一看,似乎您想要以下内容:

<xsl:variable name="Rows" select="/test/nodeset_b/item[@id != /test/nodeset_a/item/@id]"/>

但是,这并不能解决我们的问题。

分解一下,它的作用是找到nodeset_b中所有item元素,这些元素的id值与nodeset_a中的id值之一不匹配。哪一个并不重要:只要nodeset_a中有任何不匹配的id值,此 XPath 评估就会从nodeset_b返回该item。 对于上面的<test>数据,这将返回所有这些数据,从而为我们计数5.

要找到nodeset_b中所有item元素,其id值与nodeset_a中的任何id值都不匹配,我们不仅要否定等号,还要否定比较表达式本身:

<xsl:variable name="Rows" select="/test/nodeset_b/item[not(@id = /test/nodeset_a/item/@id)]"/>

对于上面的<test>数据,这仅返回id值与nodeset_a中的任何id值不匹配的nodeset_bitem元素,从而为我们提供了正确的3计数。

相关内容

  • 没有找到相关文章

最新更新