Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xslt 慕尼黑的[1]分组真的有必要吗?_Xslt_Xpath_Xslt 1.0_Xslt Grouping - Fatal编程技术网

Xslt 慕尼黑的[1]分组真的有必要吗?

Xslt 慕尼黑的[1]分组真的有必要吗?,xslt,xpath,xslt-1.0,xslt-grouping,Xslt,Xpath,Xslt 1.0,Xslt Grouping,在这里回答了大量有关堆栈溢出的XSLT问题之后,我非常熟悉用于在XSL转换期间对节点进行分组的Muenchian分组技术 其中使用的表达方式通常如下: *[generate-id() = generate-id(key('kSomeKey', .)[1])] 它几乎总是包含[1],但这总是让我感到奇怪 XSLT 1.0规范对generate-id()的定义如下: generate id函数返回一个字符串,该字符串唯一标识参数节点集中的节点,该节点按文档顺序排在第一位 (增加重点) 它清楚地

在这里回答了大量有关堆栈溢出的XSLT问题之后,我非常熟悉用于在XSL转换期间对节点进行分组的Muenchian分组技术

其中使用的表达方式通常如下:

*[generate-id() =
  generate-id(key('kSomeKey', .)[1])]
它几乎总是包含
[1]
,但这总是让我感到奇怪

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

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

(增加重点)

它清楚地表明该函数在文档顺序的第一个节点上运行,在这种情况下,
[1]
将选择文档顺序集合中的第一个节点,因此似乎
[1]
是冗余的


这个
[1]
被广泛使用,我很犹豫是否省略它,但它似乎是无关的。有人能帮我澄清一下吗?

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

我建议始终使用显式“[1]”,而不是利用XPath 1.0中的操作隐式执行这一事实。原因有二:它提高了代码的可读性,并使其与XPath2.0兼容。在某些处理器中,它可能会带来性能上的好处,但在通过测量证明之前,我不会对此进行推测。

这在XSLT 2.0中是必要的,因为
generate id
不允许将节点集作为其中的第一个参数,并抛出错误。当然,如果您使用的是XSLT2.0,那么您更可能使用
xsl:for each group
而不是Muenchian分组。谢谢!这似乎是继续使用它的正当理由。谢谢!(+1)我不确定我是否同意它提高了可读性,但互操作性始终是一个很好的目标。@jlRish对于不太熟悉XPath和XSLT规范的人,我认为
[1]
确实提高了可读性。它清楚地表明,您希望检查此节点是否是其组中的第一个节点,并且如果您希望检查组中的第二个/第三个/最后一个节点而不是第一个节点,那么很明显要调整什么。