文本值模板和 xsl:variable

Text Value Templates and xsl:variable

在变量中创建错误消息时,我注意到了一个怪癖。我原以为下面的所有 3 个示例都能正常工作 - 我使用的是 Saxon 9.8EE。

这很好用:

<xsl:variable name="error" select="'Error reading: ' || $file"/>

这也是:

<xsl:variable name="error"><text>Error reading: {$file}</text></xsl:variable>

但这会将 {$file} 呈现为文字字符串,而不是 $file 的值:

<xsl:variable name="error">Error reading: {$file}</xsl:variable>

用例在 otherwise 块中以捕获失败的文件读取:

<xsl:otherwise>
    <xsl:variable name="error" select="'Error reading: ' || $file"/>
    <xsl:message>{$error}</xsl:message>
    {$error}
</xsl:otherwise>

嵌入的文本元素是强制性的吗?为什么消息元素不需要这个?

这是一个错误。请观看错误跟踪器

https://saxonica.plan.io/issues/3748

坚持到底直到解决。

解决方法是添加属性 as="xs:string"。事实上,无论如何添加它可能是一个好主意,因为该变量几乎肯定是用作字符串(而不是用作包含单个文本节点子节点的文档节点,这是没有 "as" 属性).