XSLT:如何将属性传输到新标记

时间:2016-12-28 13:33:55

标签: html xml xslt attributes

我是XSLT的新手,无法弄清楚如何将属性从子标记复制到新标记。我很确定这是一个愚蠢的初学者的错误。

输入文件是:


    <?xml version="1.0" encoding="UTF-8"?>
    <navMap>
    <navPoint>
      <navLabel>
        <text>Chapter 1</text>
      </navLabel>
      <content src="Text/chapter01.html"/>
    </navPoint>
    </navMap>

我到目前为止的XSLT是:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <html>
  <body>
       <xsl:for-each select="navMap/navPoint">
            <h1><span><xsl:value-of select="./content/@src" /></span><xsl:value-of select="./navLabel/text" /></h1>
       </xsl:for-each>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

这将生成:

<h1><span>Text/chapter01.html</span>Chapter 1</h1>

然而,我需要:

<h1 href="Text/chapter01.html">Chapter 1</h1>

如何将新的href属性添加到h1标记并复制内容标记的src属性值?

我试过了:

<h1 href="<xsl:value-of select="./content/@src" />"><xsl:value-of select="./navLabel/text" /></h1>

但是这会产生语法错误。

1 个答案:

答案 0 :(得分:3)

首选方法是使用Attribute Value Templates

<xsl:template match="/">
  <html>
  <body>
       <xsl:for-each select="navMap/navPoint">
            <h1 href="{content/@src}">
                <xsl:value-of select="navLabel/text" />
            </h1>
       </xsl:for-each>
  </body>
  </html>
</xsl:template>

花括号表示要计算的表达式,而不是按字面输出。

您还可以使用xsl:attribute创建属性

<xsl:template match="/">
  <html>
  <body>
       <xsl:for-each select="navMap/navPoint">
            <h1>
                <xsl:attribute name="href">
                    <xsl:value-of select="content/@src" />
                </xsl:attribute>
                <xsl:value-of select="navLabel/text" />
            </h1>
       </xsl:for-each>
  </body>
  </html>
</xsl:template>

但是正如你所看到的那样,这更加冗长。如果您希望它是有条件的(例如,仅在某些情况下添加),或者如果表达式太复杂而无法放入属性值模板中,则可以使用此方法。