是否可以在变量或参数中使用“属性值模板”?

时间:2013-08-05 15:36:14

标签: xslt

这很好而且简短:

<img src="{$base}/{@filename}.jpg" />

但有时你需要重用src,所以它变成了这个:

<xsl:variable name="imgsrc">
    <xsl:value-of select="$base">/<xsl:value-of select="@filename">
    <xsl:text>.jpg</xsl:text>
</xsl:variable>
<img src="$imgsrc" />

根据http://www.w3.org/TR/xslt#dt-attribute-value-template你不能在文字元素属性之外使用“花括号插值语法”,但是可能有一个不那么黑客的黑客来做这个伎俩?我很懒,我知道。

2 个答案:

答案 0 :(得分:7)

您可以使用select表达式来定义变量,使用concat函数将各个位连接在一起:

<xsl:variable name="imgsrc" select="concat($base, '/', @filename, '.jpg')"/>
<img src="{$imgsrc}" />

这比<xsl:value-of>方法更有效,因为使用select直接将变量设置为字符串值,而不是创建包含文本节点的树片段,然后必须是在引用变量时转换回字符串。

答案 1 :(得分:5)

XSLT 3.0在这方面有一些好处:

(a)联合运营商

select="$base || '/' || @filename || '.jpg'

(b)“文本值模板”

<xsl:variable name="x">{$base}/{@filename}/.jpg</xsl:variable>

(出于兼容性原因需要启用)