3

在 XSLT 1.0 中是否可以根据实际 xslt 文档中“先前输出”的另一个值输出一个值?

我似乎找不到正确的说法。希望这个例子应该很容易理解。

<xsl:stylesheet>
  <xsl:param name="ServerUrl" select="'http://www.myserver.com/'"/>
  <xsl:template match="/">
    <html>
      <body>
        <img src="images/image1.jpg">
          <xsl:attribute name="src">
            <xsl:value-of select="concat($ServerUrl,**Value of current @src**)" />
          </xsl:attribute>
        </img>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

我想要以下输出:

<html>
  <body>
    <img src="http://www.myserver.com/images/image1.jpg"></img>
  </body>
</html>

我知道一开始这似乎是错误的,但其目的是使 XSLT 尽可能接近原始 HTML,以简化进一步的修改。

4

2 回答 2

2

您希望在文字结果元素的属性中使用 XPath 表达式的结果。

在 XSLT 中,为此使用了“属性值模板”(AVT)。要使用 AVT,您应该用左花括号和右花括号括住 XPath 表达式。AVT 可以与同一属性中的文字文本组合,从而无需使用 concat 表达式。

因此,对于您的示例,您可以使用:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform>
  <xsl:param name="ServerUrl" select="'http://www.myserver.com/'"/>
  <xsl:template match="/">
    <html>
      <body>
        <img src="{$ServerUrl}images/image1.jpg"/>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>
于 2013-07-14T03:53:33.030 回答
1

以下样式表使用document()带有空路径的函数,它将 XSLT 作为 XML 文档加载,然后将 XPath 加载到img/@src属性值:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="1.0">
    <xsl:param name="ServerUrl" select="'http://www.myserver.com/'"/>
    <xsl:template match="/">
        <html>
            <body>
                <img src="images/image1.jpg">
                    <xsl:attribute name="src">
                        <xsl:value-of select="concat($ServerUrl, document('')/xsl:stylesheet/xsl:template[@match='/']/html/body/img/@src)" />
                    </xsl:attribute>
                </img>
            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

第二个@src属性定义将“获胜”并在输出中生成。

7.1.3 创建属性

将属性添加到元素会使用相同的扩展名称替换该元素的任何现有属性。

虽然,我不会推荐这种方法。阅读/理解令人困惑,而不是标准做法。

于 2013-07-14T03:21:10.493 回答