【问题标题】:Fallbacks for XSLT 2.0 processor in 3.0 stylesheet3.0 样式表中 XSLT 2.0 处理器的回退
【发布时间】:2016-01-03 14:59:11
【问题描述】:

为了解析一些字符串,我想使用analyze-string()(如果可用),并提供一个适用于 XSLT 2.0 的较慢的回退。这是我做的一个快速测试:

<xsl:stylesheet  version="3.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="text"/>

  <xsl:template name="tokenize" 
      use-when="not(function-available('analyze-string'))">
    2.0
  </xsl:template>

  <xsl:template name="tokenize" version="3.0"
      use-when="function-available('analyze-string')">
    3.0
  </xsl:template>

  <xsl:template match="/">
    <xsl:call-template name="tokenize"/>
    <xsl:value-of select="function-available('analyze-string')"/>
  </xsl:template>

</xsl:stylesheet>

我使用 Saxon-PE/EE 9.5.1.3 在 oXygen 15.2 中运行了这个。奇怪的是,输出是

2.0
true

这表明包含第一个模板而不是第二个模板,尽管它的use-when 属性应该评估为真,如输出的第二行所示。出了什么问题?

在开发同时针对 2.0 和 3.0 处理器的样式表时,是否有标准的最佳实践?如果我使用选项-xsltversion:2.0 覆盖xsl:stylesheet 元素上的版本属性,Saxon HE 接受样式表。我还尝试将 version 属性设置为 2.0 以使覆盖变得多余,但随后 function-available('analyze-string') 在 Saxon PE/EE 中将评估为 false,即使我使用 XPath 函数命名空间作为前缀。

【问题讨论】:

  • 我已经在 Saxon 9.7 HE/PE/EE 和所有三个输出 3.0 true 上尝试过你的代码。
  • 我认为 HE 9.7 正式支持 XSLT 3.0 版样式表中的 XPath 3.0/3.1 表达式和函数,但不支持任何 XSLT 3.0 元素。 Michael Kay 在他的 9.7 公告中写道:“9.7 还包括 XPath 3.1 和 XQuery 3.1 的完整实现……包括地图和数组在内的许多新功能都包含在开源 HE 产品中,尽管用于高阶功能您需要转到专业版。”
  • 谢谢,我刚刚测试过(新的 XPath 函数在 HE 中有效,但在 XSLT 3.0 元素中无效)。所以我猜我使用 PE/EE 9.5.1.3 得到的意外结果可能是一个错误。

标签: xslt xslt-2.0 saxon backwards-compatibility


【解决方案1】:

在 Saxon 9.5 中,出于现在我无法理解的原因,use-when 表达式的静态上下文仅包括核心 XPath 2.0 函数以及一些选定的 XSLT 函数,例如 element-available、system-property 和 function-available;它不包括诸如分析字符串之类的 XPath 3.0 函数,尽管这些函数在样式表中的“普通”XPath 表达式中可用。我怀疑这反映了 2013 年 Saxon 9.5 发布时 XSLT 3.0 规范的状态。情况将在 9.6 和 9.7 中发生变化。

【讨论】:

    猜你喜欢
    • 2023-01-25
    • 2011-04-21
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 2017-05-10
    • 2014-10-15
    • 2011-06-25
    • 1970-01-01
    相关资源
    最近更新 更多