将XSLT变量放入花括号中

时间:2014-02-28 21:21:17

标签: xslt

以下示例中的卷曲括号{}是什么意思 (在前面的行中,变量$ fieldName被初始化并用字符串填充):

<xsl:element name="{$fieldName}">
    <xsl:apply-templates select="field"/>
</xsl:element>

3 个答案:

答案 0 :(得分:33)

只要您需要在属性中计算表达式,就可以使用这些花括号(属性值模板),否则这些表达式会将内容视为文本。

例如,假设您有一个XML源:

<link site="www.stackoverflow.com"/>

并且您希望从中生成HTML链接,如

<a href="http://www.stackoverflow.com">Click here</a>

如果您只是将@site的内容读入href属性,请执行以下操作:

<xsl:template match="link">
    <a href="http://@site">Click here</a>
</xsl:template>

它不起作用,因为它将被视为纯文本,你会得到:

<a href="http://@site">Click here</a>

但是如果你将@site包裹在花括号中:

<xsl:template match="link">
    <a href="http://{@site}">Click here</a>
</xsl:template>

它将被视为XPath,将被执行,您将得到:

<a href="http://www.stackoverflow.com">Click here</a>

如果不是大括号,则需要在<xsl:attribute>中使用包含<a>的{​​{1}}来获得相同的结果:

<xsl:value-of>

在您的示例中,<xsl:template match="link"> <a> <xsl:attribute name="href"> <xsl:text>http://</xsl:text><xsl:value-of select="@site"/> </xsl:attribute> <xsl:text>Link</xsl:text> </a> </xsl:template> name atrribute需要一个字符串。要将该字符串视为XPath表达式并将其替换为变量<xsl:element>的结果,您可以将其放在花括号中,或者使用上面的$fieldName元素:

<xsl:attribute>

答案 1 :(得分:6)

这些被称为Attribute Value Templates。有关详细信息,请参阅此处w3.org

  

定义:在指定为属性值的属性中   模板,例如文字结果元素的属性,   表达式可以通过用curly包围表达式来使用   括号({})。

     

属性值模板由交替序列组成   固定部件和可变部件。可变部分由XPath组成   用大括号({})括起来的表达式。固定部分可能包含   任何字符,但左侧花括号必须写为{{   并且右侧花括号必须写成}}。

答案 2 :(得分:3)

这有点难以找到,但在Creating Elements with xsl:element中进行了讨论。

  

xsl:element元素允许使用计算名称[从表达式]创建元素。要创建的元素的扩展名由必需的name属性指定。

虽然此处未明确讨论{}语法,但在其他上下文中也使用了大括号的含义,例如Creating Elements and Attributes,并且也适用于此处。

  

文字结果元素的属性值被解释为属性值模板:它可以包含花括号({})中包含的 [XPath]表达式

在这种情况下,$fieldName只是一个变量的XPath表达式,它应该计算为有效的元素名称。