为什么不是我XSLT变量替换他们的价值观?
-
10-07-2019 - |
题
我正尝试使用XSLT变量和不具有很大的成功,希望我只是在做什么愚蠢的。
我有以下代码段:
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xslt"
version="1.0">
<xsl:template match="/">
<xsl:variable name="config" select="query/@config"></xsl:variable>
所以我希望有一个可变的"配置"的设定值"配置"属性的我的顶级件'询'.
然后我尝试使用的变量后,在我的样式表,例如:
<a href="localhost/test?go">
{$config}
</a>
但是输出我看到的在我的输出HTML文件是:
<a href="localhost/test?go">
{$config}
</a>
因此价值没有被取代,因为我们的预期。
我认为这是很简单的情况下有可能,所以我做domething愚蠢!请帮帮忙,谢谢!
更新感谢所有作出答复,我误会了不同的上下文的是否是我的工作在一个属性或外部。按我的问题出来很好!
如果我能我会接受两个答案,一个我和@Aaron Digulla的,其解释该特性的事情。
解决方案
在样式表中,您必须使用:
<xsl:value-of select="$config"/>
而不是:
{$config}
其他提示
有两个问题,在这里,似乎是相同的,但这是微妙的不同:1) 如何 我要参考一个可变的名字?2) 哪里 我可以参照一个可变的名字?
首先,变量总是引用的使用 $varname
语法。第二,这是可以做到 任何地方的一种表达,是允许的.这是第二部分,这个似乎混淆。开始时,值的一种元素的属性或将默认输出字面上,所以没有变量实际中引用下面的例子:
<element attr="$test">$test or {$test}</element>
输出将从字面上的比赛是什么类型。
输出变量的价值,我们需要参考这里表达,是允许的。在元件的内容,我们使用 xsl:value-of
;在特性被视为一个 属性价值的模板 (例如属性的字面结果元素),表达分隔括号括起来 {}
.假设以下宣言:
<xsl:variable name="test" select="'value'"/>
...然后如下:
<element attr="{$test}"><xsl:value-of select="$test"/></element>
...结果:
<element attr="value">value</element>
几切注意到在中和 value-of
:
- 在这两种情况下变量引用的作为
$test
.括号中的印度部的变量的参考;他们表达符。 - 在任何一种情况下,表达不需要有包含基准的变量;任何XPath表将被允许的。
- 不是所有的属性,在一个XSLT document被视为属性价值的模板。例如,注意到
xsl:value
'sselect
属性 已经接受一种表达 作为内容。 的问题:为什么你不能使用
value-of
在一个属性,这样吗?<element attr="<xsl:value-of select="$test"/>"/>
答案:因为XSLT文件必须包含的XML(而不是).
的问题:为什么你不能使用
{$varname}
在元件的内容?巧舌如簧的答案:因为XSLT的创造者没有设计这种方式。
{$config}
仅适用于XSLT元素的属性。 (注意:括号内的美元因为完整的XPath表达式必须用大括号包围)
使用<xsl:value-of select="$config"/>
代替{$config}
。
@ lwburk的答案很棒(+1),但最后一个问题/答案仅适用于XSLT 1.0和2.0。在3.0中,您可以使用TVT(文本值模板;类似于@ lwburk的回答中提到的AVT(属性值模板)。
要使用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进行测试。
因为您需要使用<xsl:value-of select="config"/>
?