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]真的有必要吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用 XSLT 对 HTML 输出进行分组(muenchian 分组?)