对于解析某些字符串,我想使用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函数名称空间。
答案 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中发生变化。