文本节点中的XSL属性表达式表示法

时间:2014-06-13 16:59:08

标签: xslt xslt-1.0

value-of太可怕了。当我需要在文本节点中插入大量变量值时,它确实污染了XSL文件。

是否有办法在输出文本节点的内部使用属性表达式表示法,即text text {$variable}?或者至少比value-of更简洁?

2 个答案:

答案 0 :(得分:5)

不在XSLT 1.0中。但是,在XSLT 3.0中,您可以使用TVT(text value templates)。它们的工作方式与AVT(attribute value templates)相同。

要使用TVT,请将标准属性xsl:expand-text="yes"添加到元素中。这将导致处理器将该元素的后代文本节点视为TVT。

示例:

XSLT 3.0

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes"/>

    <xsl:template match="/">
        <xsl:variable name="who" select="'Dan'"/>
        <xsl:variable name="what" select="'BAM!'"/>
        <result xsl:expand-text="yes">This is {$who}'s result: {$what}</result>
    </xsl:template>

</xsl:stylesheet>

输出(使用任何格式良好的XML作为输入)

<result>This is Dan's result: BAM!</result>

注意:使用Saxon-PE 9.5进行测试。

这是一个更好的例子,显示正在评估的“后代”文本节点......

XML输入

<test>
    <v1>one</v1>
    <v2>two</v2>
    <v3>three</v3>
</test>

XSLT 3.0

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

    <xsl:template match="/*">
        <result xsl:expand-text="yes">
            <value>Value of v1: {v1}</value>
            <value>Value of v2: {v2}</value>
            <value>Value of v3: {v3}</value>
        </result>
    </xsl:template>

</xsl:stylesheet>

<强>输出

<result>
   <value>Value of v1: one</value>
   <value>Value of v2: two</value>
   <value>Value of v3: three</value>
</result>

答案 1 :(得分:3)

你可以使用concat。

<xsl:value-of select="concat(
  'text text ',
  $variable,
  'text text ',  
  $variable,
  'text text'
)" />