3.0 样式表中 XSLT 2.0 处理器的回退

Fallbacks for XSLT 2.0 processor in 3.0 stylesheet

为了解析一些字符串,我想使用 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>

我 运行 在 oXygen 15.2 和 Saxon-PE/EE 9.5.1.3 中。 st运行gely,输出为

2.0
true

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

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

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