【发布时间】: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