将xsl变量定义为terminate
的<xsl:message>
属性不起作用:
<xsl:variable name="TERMINATE_ON_ERROR" select="'no'" />
<xsl:message terminate="$TERMINATE_ON_ERROR">
<xsl:text>foo</xsl:text>
</xsl:message>
<!-- ... -->
<xsl:message terminate="$TERMINATE_ON_ERROR">
<xsl:text>bar</xsl:text>
</xsl:message>
这迫使我在所有情况下都使用terminate="no"
:
<xsl:message terminate="no">
<xsl:text>foo</xsl:text>
</xsl:message>
<!-- ... -->
<xsl:message terminate="no">
<xsl:text>bar</xsl:text>
</xsl:message>
然后,如果我改变主意,而不是仅更改单个变量,则替换所有它们。
我更喜欢XSLT 1.0(使用xsltproc
)的解决方案。
在XSLT 2(https://www.w3.org/TR/xslt20/#message)和3(https://www.w3.org/TR/xslt-30/#element-message)中,terminate
属性允许使用属性值模板(例如terminate="{$TERMINATE_ON_ERROR}"
),但XSLT 1 https://www.w3.org/TR/xslt-10/#message似乎不允许。
因此,在XSLT 1的情况下,类似XSLT的主要方法是编写一个样式表以创建第二个样式表,为此您必须使用xsl:namespace-alias
,如https://www.w3.org/TR/xslt-10/#section-Creating-Elements-and-Attributes所示。
在XSLT 1.0中,在<xsl:message>
上使用Saxon 6.5.4 AVT对我有用:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="*">
<xsl:variable name="vTerm" select="'no'"/>
<xsl:message terminate="{$vTerm}">XXX</xsl:message>
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
当此转换应用于以下XML文档(可以使用任何XML文档):
<a>
<b>
<c/>
</b>
</a>
撒克逊人(我的重点)的结果是:
SAXON 6.5.4 from Michael Kay Java version 1.8.0_191 Preparation time: 51 milliseconds Processing file:/(Untitled) Building tree for file:/(Untitled) using class com.icl.saxon.tinytree.TinyBuilder Tree built in 2 milliseconds Loading com.icl.saxon.output.MessageEmitter **XXX** **XXX** **XXX** Execution time: 14 milliseconds