我是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>
但是这会产生语法错误。
答案 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>
但是正如你所看到的那样,这更加冗长。如果您希望它是有条件的(例如,仅在某些情况下添加),或者如果表达式太复杂而无法放入属性值模板中,则可以使用此方法。