xsl:消息由变量定义的终止属性(类似设置)

问题描述 投票:1回答:2

将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 xslt-1.0
2个回答
2
投票

在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所示。


0
投票

在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
© www.soinside.com 2019 - 2024. All rights reserved.