我正尝试使用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's select 属性 已经接受一种表达 作为内容。
  • 的问题:为什么你不能使用 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"/>

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top