3.0样式表中

时间:2016-01-03 14:59:11

标签: xslt xslt-2.0 saxon backwards-compatibility

对于解析某些字符串,我想使用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属性应该已经评估为true,因为输出的第二行表示。出了什么问题?

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

1 个答案:

答案 0 :(得分:1)

在Saxon 9.5中,由于现在让我失望的原因,use-when表达式的静态上下文仅包含核心XPath 2.0函数以及一些选定的XSLT函数,如element-available,system-property和function-available;它不包括XPath 3.0函数,例如analyze-string,即使它们在样式表中的“普通”XPath表达式中可用。我怀疑这反映了Saxon 9.5在2013年发布时XSLT 3.0规范的状态。情况将在9.6和9.7中发生变化。