XSLT-Key()函数

XSLT-Key()函数,xslt,key,iteration,Xslt,Key,Iteration,我对这个关键功能有点困惑: <xsl:for-each select="article[count(. | key('idkey', @id)[1]) = 1]> 此中的用于每个元素 <xsl:for-each select="article[count(. | key('idkey', @id)[1]) = 1]"> 它通过比较生成的id直接检查当前元素是否与集合中的第一个元素相同。表达式key('idkey',@id)[1]选择idkey等于@id的第一个元素

我对这个关键功能有点困惑:

 <xsl:for-each select="article[count(. | key('idkey', @id)[1]) = 1]>

中的
用于每个
元素

<xsl:for-each select="article[count(. | key('idkey', @id)[1]) = 1]">
它通过比较生成的id直接检查当前元素是否与集合中的第一个元素相同。

表达式
key('idkey',@id)[1]
选择idkey等于@id的第一个元素

表达式
count(A | B)=1
是测试A和B是否为同一节点的一种疯狂的XSLT1.0变通方法。(您还会看到人们为此使用
generate id(A)=generate id(B)
。)

将这些元素放在一起,您将询问当前元素是否是文档中具有特定id值的第一个元素

这就是所谓的Muenchian分组(在XSLT2.0中变得多余)技术的基础


代码有点可疑,因为密钥似乎与报纸id匹配,而不是文章id。但也许它们在某种程度上是相关的。

对不起,你在这里错了,因为idkey不是文章的键/@id它是报纸的键/@id。或者我在这里遗漏了什么吗?@hr_117:在写这篇文章时,我希望OP已经显示了
idkey
的声明。不知怎的,我忽略了它。但是事情是这样的,
select
XPath是非常奇怪的,因为
key()
返回的节点集不能包含
article
元素,谓词与
1+count(key('idkey',@id)[1])=1
或者,如您所说,
not(key('idkey',@id))
相同。这显然是一个错误。
select="article[generate-id() = generate-id(key('idkey', @id)[1])]"