Xslt 文本节点中的XSL属性表达式表示法
Xslt 文本节点中的XSL属性表达式表示法,xslt,xslt-1.0,Xslt,Xslt 1.0,的值是可怕的。当我需要在文本节点中插入大量变量值时,它确实污染了XSL文件 是否有一种方法可以在输出文本节点内部使用属性表达式表示法,即文本{$variable}?或者至少是比XSLT1.0中没有的值更简洁的东西。但是,在XSLT3.0中,可以使用TVTs()。它们的工作原理与AVTs()相同 要使用TVT,请将标准属性xsl:expand text=“yes”添加到元素中。这将导致处理器将该元素的子代文本节点视为TVT 例如: XSLT 3.0 <xsl:stylesheet versi
的值是可怕的。当我需要在文本节点中插入大量变量值时,它确实污染了XSL文件
是否有一种方法可以在输出文本节点内部使用属性表达式表示法,即文本{$variable}
?或者至少是比XSLT1.0中没有的值更简洁的东西。但是,在XSLT3.0中,可以使用TVTs()。它们的工作原理与AVTs()相同
要使用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>
<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>
这是{$who}的结果:{$what}
输出(使用任何格式良好的XML作为输入)
这是丹的结果:砰!
注:使用Saxon PE 9.5进行测试
下面是一个更好的示例,显示正在计算的“后代”文本节点
XML输入
<test>
<v1>one</v1>
<v2>two</v2>
<v3>three</v3>
</test>
<result>
<value>Value of v1: one</value>
<value>Value of v2: two</value>
<value>Value of v3: three</value>
</result>
一
二
三
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>
<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>
v1的值:{v1}
v2的值:{v2}
v3的值:{v3}
输出
<test>
<v1>one</v1>
<v2>two</v2>
<v3>three</v3>
</test>
<result>
<value>Value of v1: one</value>
<value>Value of v2: two</value>
<value>Value of v3: three</value>
</result>
v1值:1
v2值:2
v3值:三
您可以使用concat
<xsl:value-of select="concat(
'text text ',
$variable,
'text text ',
$variable,
'text text'
)" />
这里,输入和所需输出的示例可能非常有用。我建议立即使用命名模板。请看下面的示例:我正要将concat()
作为1.0/2.0选项添加到我的答案中+1这可能是我的最佳选择。对于XSLT 1.0,它肯定是。存在一个问题。它将文本字符串中的文字换行符解释为空格。有没有一种方法可以避免这些问题?这是因为在解析XSLT脚本时,XML解析的标准规则适用。它们说:属性值中的文字换行符折叠到空间中,字符实体将被解码。因为select=“…”
首先是一个XML属性。。。(0xA;
也可以,如果您喜欢十六进制代码的话。)这是我最喜欢的XSLT 3.0功能之一。虽然这很有趣,但不幸的是我被限制在1.0。@Reinderien-这很不幸。@helderdarocha-我同意!我添加了一个更好的示例来说明如何计算子体文本节点。