我在Muenchian方法的实现中看到了这行代码:
<xsl:for-each
select="//product[count(. | key('products-by-category', @category)[1]) = 1]">
我不明白count()
发生了什么。我认为count(.)
的意思是count(self::product)
,它总是1,管道运算符(|)添加了与键匹配的第一个节点,但键"products by category"不应该总是返回一个节点集吗?
每个循环的this在哪些元素中迭代?你能为这个表达提供一个自然语言的翻译吗?谢谢
在XPath 1.0中,表达式count($x|$y)=1
用于测试$x和$y是否为同一节点。在2.0中,您可以使用更直观的表达式$x is $y
。它之所以有效,是因为如果$x和$y都是单例集,那么如果两个集不同,那么这两个集的并集将包含两个节点,但如果它们相同,则仅包含一个节点。
在本例中,表达式用于询问"当前节点是第一个具有特定键值的节点吗",这是Muenchian分组中使用的关键测试。
在XPath1.0中执行相同测试的另一种方法是表达式generate-id($x) = generate-id($y)
。您将看到使用了这两种形式。
你能为这个表达提供一个自然语言的翻译吗?
简而言之,它的意思是"针对其类别中排名第一的每种产品"。
怎么会这样?它包含所有产品元素,位于文档中的任何位置:
<xsl:for-each select="//product">
并通过表达式进行过滤:
[count(. | key('products-by-category', @category)[1]) = 1]
在这个表达式中,这个部分:
key('products-by-category', @category)[1])
是指与当前评估产品中的第一个产品节点在同一类别中的第一产品节点。
现在,如果当前评估的产品也是其类别中的第一个产品,那么将两者相加将返回1。否则,将有两个不同的节点需要计数,结果将为2。