2016-12-28 69 views
0

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

如何向h1标记添加新的href属性并复制content标记的src属性的值?

我想:

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

,但生成语法错误。

回答

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> 

但正如你可以看到这是稍微啰嗦。例如,如果您希望它是有条件的(即仅在特定情况下添加),或者如果表达式太复杂而无法放入属性值模板中,则可以使用它。

+0

感谢您的回复! –