这个xpath中count()的功能是什么?

时间:2015-02-09 19:01:33

标签: xml xslt xpath

我在Muenchian method的实现中看到了这行代码:

<xsl:for-each 
select="//product[count(. | key('products-by-category', @category)[1]) = 1]">

我不知道count()发生了什么。我认为count(.)表示count(self::product),它始终为1,管道运算符(|)添加与键匹配的第一个节点,但不应该是关键产品 - 通过类别&#39;如果产品具有&#39;类别,则始终返回节点集。属性因此匹配自己?

这个for-each循环在哪些元素中迭代?你能为这个表达提供自然语言翻译吗?感谢。

2 个答案:

答案 0 :(得分:5)

在XPath 1.0中,表达式count($x|$y)=1用于测试$ x和$ y是否是同一节点。在2.0中,您可以使用更直观的表达式$x is $y。这是有效的,因为如果$ x和$ y都是单例集,那么两个集合的并集将包含两个节点(如果它们不同),但只有一个节点相同。

在这个例子中,表达式用于询问“当前节点是第一个具有其特定键值的节点”,这是Muenchian分组中使用的关键测试。

在XPath 1.0中执行相同测试的另一种方法是表达式generate-id($x) = generate-id($y)。您将看到两种形式的使用。

答案 1 :(得分:2)

  

您能为此表达式提供自然语言翻译吗?

很快,对于同类产品中的第一个产品而言,这意味着&#34;&#34;。

怎么样?它需要所有产品元素,位于文档的任何位置:

<xsl:for-each select="//product">

并按表达式过滤它们:

[count(. | key('products-by-category', @category)[1]) = 1]

在这个表达式中,这部分:

key('products-by-category', @category)[1])

是指与当前评估的产品属于同一类别的第一个产品节点。

现在,如果当前评估的产品也是其类别中的第一个产品,那么将两者一起计数将返回1.否则,将有两个不同的节点要计数,结果将为2.