2016-12-28 3 views
0

Ich bin neu in XSLT und kann nicht herausfinden, wie man ein Attribut von einem Kind-Tag zu einem neuen Tag kopiert. Ich bin mir ziemlich sicher, dass es ein dummer Anfängerfehler ist.XSLT: Wie man ein Attribut auf ein neues Tag überträgt

Die Eingabedatei ist:

 

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

Die XSLT, die ich bisher habe, ist:

<?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> 

Das wird erzeugen:

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

aber ich brauche:

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

Wie füge ich dem h1-Tag ein neues href-Attribut hinzu und kopiere den Wert des src-Attributs des Inhalts-Tags?

I versucht:

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

sondern dass ein Syntaxfehler erzeugt.

Antwort

3

Der bevorzugte Weg ist in der Regel Attribute Value Templates zu verwenden.

<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> 

Die geschweiften Klammern geben einen Ausdruck an, der ausgewertet werden soll, statt wörtlich auszugeben.

Sie können auch xsl:attribute verwenden, um ein Attribut

<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> 

erstellen Aber wie Sie dies ist etwas langatmig zu sehen. Sie könnten dies jedoch verwenden, wenn Sie möchten, dass es bedingt ist (d. H. Nur unter bestimmten Umständen hinzugefügt wird), oder wenn der Ausdruck viel zu kompliziert ist, um in eine Attributwertvorlage zu passen.

+0

Vielen Dank für Ihre sehr hilfreiche Antwort! –

Verwandte Themen