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

Posted

技术标签:

【中文标题】Muenchian分组中的[1]真的有必要吗?【英文标题】:Is the [1] in Muenchian grouping really necessary? 【发布时间】:2015-02-18 00:59:02 【问题描述】:

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

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

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

它几乎总是包含[1],但这总是让我觉得很奇怪。

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

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

(强调)

它明确指出该函数在文档顺序中的第一个节点上运行,在这种情况下,[1] 将选择文档顺序中的第一个节点,因此[1] 似乎是多余的.

这个[1] 被广泛使用,以至于我犹豫要不要省略它,但它似乎无关紧要。谁能帮我解决这个问题?

【问题讨论】:

这在 XSLT 2.0 中是必要的,因为 generate-id 不允许节点集作为其中的第一个参数,并引发错误。当然,如果您使用的是 XSLT 2.0,则更有可能使用 xsl:for-each-group 而不是 Muenchian Grouping。 【参考方案1】:

我建议始终使用显式的“[1]”,而不是利用 XPath 1.0 中的操作隐式执行这一事实。有两个原因:它提高了代码的可读性,并使其与 XPath 2.0 兼容。可能有一些处理器会带来性能优势,但在经过测量证明之前,我不会推测这一点。

【讨论】:

谢谢! (+1) 我不确定我是否同意它提高了可读性,但互操作性始终是一个很好的目标。 @JLRishe 对于不太熟悉 XPath 和 XSLT 规范的人来说,我认为[1] 确实提高了可读性。它清楚地表明您要检查此节点是否是其组中的第一个节点,并且如果您想检查组中的第二个/第三个/最后一个而不是第一个,则很明显要调整什么。跨度> 【参考方案2】:

从语义上讲,[1] 不是必需的,但取决于 XSLT 处理器中的(缺乏)优化,拥有它可能更有效。 key('key-name', foo)[1] 是否只计算一个节点或首先计算一个节点集,其中所有节点由键选择,然后取第一个,这取决于每个 XSLT 处理器的内部结构,这取决于 XSLT 处理器识别@987654323 @ 作为表达式,其中只需要由键计算的节点集中的第一个节点。

【讨论】:

谢谢!这似乎是继续使用它的正当理由。

以上是关于Muenchian分组中的[1]真的有必要吗?的主要内容,如果未能解决你的问题,请参考以下文章

Muenchian 分组 XSLT 1.0 多重分组

使用 XSLT 对 HTML 输出进行分组(muenchian 分组?)

Muenchian 分组样式表返回重复的未分组节点

我无法理解 XSLT 1.0 Muenchian 分组

如何正确使用 Muenchian 按元素对非常重复的标签进行分组?

xsl muenchian 分组多个级别