【问题标题】:XSLT 2.0 breaks my stylesheetXSLT 2.0 破坏了我的样式表
【发布时间】:2014-08-15 03:37:03
【问题描述】:

我有一个在 1.0 版中开发的样式表。我需要转换到 2.0 版才能利用一些附加功能。但是,现在,当我使用以下语法时,我会得到所有结果,而不仅仅是第一个结果。这在 v1.0 中有效,但在 v2.0 中无效:

//elementName[1]

有简单的解决方法吗?

【问题讨论】:

标签: xslt xslt-1.0 xslt-2.0


【解决方案1】:

XPath 将在两个版本中返回相同的节点(即文档中的所有 elementName 元素,它们是各自父元素中具有该名称的第一个子元素),但是

<xsl:value-of select="//elementName[1]"/>

会给出不同的结果。在 XSLT 1.0 中,value-of 在给定一组节点时的行为是按文档顺序输出集合中第一个节点的值并忽略其他节点,但在 2.0 中它将输出 all 的值em> 其中,以空格分隔。如果你想限制在序列中的第一项,你应该明确地使用(....)[1]

【讨论】:

    【解决方案2】:

    是的,修复很简单...

    (//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