Muenchian分组中的[1]真的有必要吗?

时间:2014-12-19 05:22:13

标签: xslt xpath xslt-1.0 xslt-grouping

在Stack Overflow上回答了大量的XSLT问题后,我非常熟悉在XSL转换过程中对节点进行分组的Muenchian分组技术。

其中使用的表达通常是这样的:

*[generate-id() =
  generate-id(key('kSomeKey', .)[1])]

它几乎总是包含[1],但这总是让我感到奇怪。

XSLT 1.0规范定义generate-id()如下:

  

generate-id函数返回一个字符串,该字符串唯一标识参数节点集中首先按文档顺序的节点。

(强调补充)

它清楚地表明该函数按文档顺序在第一个节点上运行,并且在此上下文中,[1]将按文档顺序选择集合中的第一个节点,因此似乎{{1是多余的。

这个[1]被广泛使用,我对于忽略它犹豫不决,但它似乎无关紧要。任何人都可以为我解决这个问题吗?

2 个答案:

答案 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))作为表达式,其中只需要由密钥计算的节点集中的第一个节点。