为什么我的 XSLT 变量没有替换它们的值?

发布于 2024-07-14 16:08:14 字数 844 浏览 7 评论 0 原文

我正在尝试使用 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,它解释了属性的事情。

I am trying to use XSLT variables and not having much success, hopefully I'm just doing something dumb.

I have the following code snippet:

<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>

so I expect there to be a variable 'config' set to the value of the 'config' attribute of my top-level element 'query'.

I then try to use the variable later in my stylesheet, for example:

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

but the output I see in my output HTML document is:

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

so the value has not been substituted as I would have expected.

I think this is pretty much the simplest case there could be, so I'm doing domething stupid! Please help, thanks!


UPDATE thanks to all who responded, I misunderstood the different contexts of whether I was working in an attribute or outside. Sorted my problem out nicely!

If I could I would accept two answers, the one I have, and @Aaron Digulla's, which explained the attributes thing.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

总以为 2024-07-21 16:08:14

这里有两个问题看似相同,但略有不同: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:valueselect 属性已经接受表达式作为内容。
  • 问题:为什么不能像这样在属性中使用 value-of

    "/> 
      

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

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

    圆滑的回答:因为 XSLT 的创建者并没有那样设计。

There are two questions here that seem the same, but which are subtly different: 1) How do I reference a variable by name? 2) Where can I reference a variable by name?

First, variables are always referenced using the $varname syntax. Second, this can be done anywhere an expression is allowed. It's the second part of this that seems to confuse. To start with, the value of an element or attribute will by default be output literally, so no variables are actually referenced in the following example:

<element attr="$test">$test or {$test}</element>

The output will literally match what was typed.

To output a variable's value, we need to reference it where an expression is allowed. In element content, we use xsl:value-of; in attributes that are treated as an Attribute Value Template (e.g. the attributes of a literal result element), expressions are delimited by curly braces {}. Assume the following declaration:

<xsl:variable name="test" select="'value'"/>

...then the following:

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

...results in:

<element attr="value">value</element>

A few parting notes on AVTs and value-of:

  • In both cases the variable was referenced as $test. The braces in an AVT are not part of the variable reference; they are expression delimiters.
  • In either case, the expression need not have contained a reference to a variable; any XPath expression would have been allowed.
  • Not all attributes in an XSLT document are treated as attribute value templates. For example, notice that xsl:value's select attribute already accepts an expression as content.
  • Question: Why can't you use value-of in an attribute, like this?

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

    Answer: Because XSLT documents must contain well-formed XML (and that isn't).

  • Question: Why can't you use {$varname} in element content?

    Glib answer: because XSLT's creators didn't design it that way.

潇烟暮雨 2024-07-21 16:08:14

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

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

而不是:

{$config}

In your stylesheet you must use:

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

instead of:

{$config}
南薇 2024-07-21 16:08:14

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

{$config} only works in attributes of XSLT elements. (Note: dollar inside the brace because the complete XPath expression must be surrounded by braces)

牵强ㄟ 2024-07-21 16:08:14

使用 而不是 {$config}

Use <xsl:value-of select="$config"/> instead of {$config}.

牵你手 2024-07-21 16:08:14

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

@lwburk's answer is great (+1), but the last question/answer is only accurate for XSLT 1.0 and 2.0. In 3.0 you can use a TVT (Text Value Template; similar to the AVT (Attribute Value Template) mentioned in @lwburk's answer).

To use a TVT, add the standard attribute xsl:expand-text="yes" to the element. This will cause the processor to treat descendant text nodes of that element as a TVT.

Example:

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>

Output (using any well-formed XML as input)

<result>This is Dan's result: BAM!</result>

Note: Tested using Saxon-PE 9.5.

依 靠 2024-07-21 16:08:14

因为您需要使用

Because you need to use <xsl:value-of select="config"/> ?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文