2016-12-28 4 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> 

Как добавить новый атрибут href в тег h1 и скопировать значение атрибута 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

Спасибо за ваш ответ! –