5

我正在尝试使用 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>

所以我希望有一个变量'config'设置为我的顶级元素'query'的'config'属性的值。

然后,我稍后尝试在样式表中使用该变量,例如:

<a href="localhost/test?go">
    {$config}
</a>

但我在输出 HTML 文档中看到的输出是:

<a href="localhost/test?go">
    {$config}
</a>

所以这个值没有像我预期的那样被替换。

我认为这几乎是最简单的情况,所以我在做傻事!请帮忙,谢谢!


更新感谢所有回复的人,我误解了我是在属性中还是在属性之外工作的不同背景。很好地解决了我的问题!

如果可以的话,我会接受两个答案,一个是我的答案,另一个是 @Aaron Digulla 的,它解释了属性问题。

4

6 回答 6

13

这里有两个问题看起来相同,但有细微的不同: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>

关于 AVT 和 的一些离别说明value-of

  • 在这两种情况下,变量都被引用为$test. AVT 中的大括号不是变量引用的一部分;它们是表达式分隔符。
  • 在任何一种情况下,表达式都不需要包含对变量的引用;任何 XPath 表达式都是允许的。
  • 并非 XSLT 文档中的所有属性都被视为属性值模板。例如,注意xsl:value'sselect属性已经接受一个表达式作为内容。
  • 问题:为什么不能value-of像这样在属性中使用?

    <element attr="<xsl:value-of select="$test"/>"/>
    

    :因为 XSLT 文档必须包含格式良好的 XML(而事实并非如此)。

  • 问题:为什么不能{$varname}在元素内容中使用?

    Glib 回答:因为 XSLT 的创建者没有那样设计它。

于 2011-12-14T18:44:32.803 回答
12

在您的样式表中,您必须使用:

<xsl:value-of select="$config"/>

代替:

{$config}
于 2009-03-11T12:30:58.470 回答
6

{$config}仅适用于 XSLT 元素的属性。(注意:大括号内的美元,因为完整的 XPath 表达式必须用大括号括起来)

于 2009-03-11T12:34:40.973 回答
3

使用<xsl:value-of select="$config"/>而不是{$config}.

于 2009-03-11T12:29:59.160 回答
1

@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 进行测试。

于 2014-05-12T22:44:44.547 回答
0

因为你需要使用<xsl:value-of select="config"/>

于 2009-03-11T12:30:43.370 回答