【发布时间】:2014-08-15 03:37:03
【问题描述】:
我有一个在 1.0 版中开发的样式表。我需要转换到 2.0 版才能利用一些附加功能。但是,现在,当我使用以下语法时,我会得到所有结果,而不仅仅是第一个结果。这在 v1.0 中有效,但在 v2.0 中无效:
//elementName[1]
有简单的解决方法吗?
【问题讨论】:
-
您能否提供一个小的snippet 文档和样式表来重现该问题,并指定您正在使用的 2 个处理器的名称?
我有一个在 1.0 版中开发的样式表。我需要转换到 2.0 版才能利用一些附加功能。但是,现在,当我使用以下语法时,我会得到所有结果,而不仅仅是第一个结果。这在 v1.0 中有效,但在 v2.0 中无效:
//elementName[1]
有简单的解决方法吗?
【问题讨论】:
XPath 将在两个版本中返回相同的节点(即文档中的所有 elementName 元素,它们是各自父元素中具有该名称的第一个子元素),但是
<xsl:value-of select="//elementName[1]"/>
会给出不同的结果。在 XSLT 1.0 中,value-of 在给定一组节点时的行为是按文档顺序输出集合中第一个节点的值并忽略其他节点,但在 2.0 中它将输出 all 的值em> 其中,以空格分隔。如果你想限制在序列中的第一项,你应该明确地使用(....)[1]。
【讨论】:
是的,修复很简单...
(//elementName)[1]
这将为您提供第一次出现。您之前的 xpath 是每个 elementName,它是其父级的第一个 elementName 子级。
来自spec的一个很好的例子:
注意:位置路径 //para[1] 确实 not 与 位置路径 /descendant::para[1]。后者选择第一个 后代 para 元素;前者选择所有后代 para 元素是他们父母的第一个 para 孩子。
【讨论】:
//elementName[1] 在 XSLT 1.0 和 2.0 之间应该没有区别。如果它的行为不同,那么他可能正在使用有缺陷的 XPath 1.0 引擎。
value-of时:xsltransform.net/jyH9rLV/5。