如何添加XSL属性

4

我有一个包含img标签的xml文件

<img>
source
</img>

我想要生成:

<img src="source.jpg">

我尝试了类似这样的方法:
<img>
<xsl:attribute name="src">
  <xsl:text>
        <xsl:value-of select="node()" />.jpg
      </xsl:text>
    </xsl:attribute>
</img> 

但它不起作用。


1
好问题(+1)。看看我的答案,有一个简短而简单的解决方案。 - Dimitre Novatchev
4个回答

5

用途:

<img src="{normalize-space()}.jpg"/>

这假设当前节点是<img>元素。

2
我最近开始使用属性值模板,并且认为它们非常有用,而且在适当的情况下可以使代码简洁易读。我建议所有XSL新手调查一下:http://www.w3.org/TR/xslt#attribute-value-templates - andyroberts
@arooaroo,是的,完全同意。 - Dimitre Novatchev

4
你所做的事情不起作用的原因是在 <xsl:text> 元素内无法评估 XSLT 表达式。 <xsl:text> 只能包含字面文本、实体引用和 #PCDATA
如果将 <xsl:value-of> 移到 <xsl:text> 外面,那么以下内容将起作用:
    <img>
        <xsl:attribute name="src">
            <xsl:value-of select="node()" />
            <xsl:text>.jpg</xsl:text>
        </xsl:attribute>
    </img>

然而,在你的例子中选择<xsl:value-of select="node()>作为<img>的选项将包含换行符和空格字符在<img>元素内部,这可能不是你想要的src属性值。这就是为什么Dimitre Novatchev在他的回答中使用了normalize-space()。将其应用于上面的示例:
    <img>
        <xsl:attribute name="src">
            <xsl:value-of select="normalize-space(node())" />
            <xsl:text>.jpg</xsl:text>
        </xsl:attribute>
    </img>

如果你按照Fabiano's solution所建议的去掉<xsl:text>,那么你也可以这样做:
    <img>
        <xsl:attribute name="src"><xsl:value-of select="normalize-space(node())" />.jpg</xsl:attribute>
    </img> 

1
只需删除 xsl:text 标签即可,在这种情况下,您将不需要它。请尝试这样做:
<img>   
    <xsl:attribute name="src">
        <xsl:value-of select="concat(node(), '.jpg')"/>
    </xsl:attribute>
</img>

我没有测试过,但应该可以工作。=)


这样做是可以“工作”的,但会包括空白文本节点,生成<img src="&#xA; source&#xA;.jpg"/>,这可能不是@liysd想要的结果。按照@Dimitre Novatchev建议的使用normalize-space()函数,你的答案将变得有效。 - Mads Hansen

1
<img>
    <xsl:attribute name="src">
        <xsl:value-of select="my_photo/@href" />
    </xsl:attribute>
</img>

<my_photo href="folder/poster.jpg" /> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接