在Stack Overflow上回答了大量的XSLT问题后,我非常熟悉在XSL转换过程中对节点进行分组的Muenchian分组技术。
其中使用的表达通常是这样的:
*[generate-id() =
generate-id(key('kSomeKey', .)[1])]
它几乎总是包含[1]
,但这总是让我感到奇怪。
XSLT 1.0规范定义generate-id()
如下:
generate-id函数返回一个字符串,该字符串唯一标识参数节点集中首先按文档顺序的节点。
(强调补充)
它清楚地表明该函数按文档顺序在第一个节点上运行,并且在此上下文中,[1]
将按文档顺序选择集合中的第一个节点,因此似乎{{1是多余的。
这个[1]
被广泛使用,我对于忽略它犹豫不决,但它似乎无关紧要。任何人都可以为我解决这个问题吗?
答案 0 :(得分:4)
我建议总是使用显式的“[1]”,而不是利用XPath 1.0中的操作隐式执行它的事实。有两个原因:它提高了代码的可读性,并使其与XPath 2.0兼容。可能有处理器可以提供性能优势,但在测量结果证明之前我不会推测它。
答案 1 :(得分:2)
从语义上讲,[1]
不是必需的,但取决于XSLT处理器中的(缺乏)优化,拥有它可能更有效。它将取决于每个XSLT处理器的内部结构,key('key-name', foo)[1]
是仅计算一个节点还是首先计算一个节点集,其中所有节点都由密钥选择,然后取决于它取决于XSLT处理器识别的第一个节点集generate-id(key('key-name', foo))
作为表达式,其中只需要由密钥计算的节点集中的第一个节点。