value-of
太可怕了。当我需要在文本节点中插入大量变量值时,它确实污染了XSL文件。
是否有办法在输出文本节点的内部使用属性表达式表示法,即text text {$variable}
?或者至少比value-of
更简洁?
答案 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'
)" />