所以,我有两个变量,每个变量包含一个节点集(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_b
item
元素,从而为我们提供了正确的3
计数。