2013-09-27 10 views
6

Vereinfachtes Beispiel:XSLT - Gibt es eine Möglichkeit, an Attribute anzufügen, die mit <xsl: attribute> hinzugefügt wurden?

<xsl:template name="helper"> 
    <xsl:attribute name="myattr">first calculated value</xsl:attribute> 
</xsl:template> 

<xsl:template match="/> 
    <myelem> 
    <xsl:call-template name="helper" /> 
    <xsl:attribute name="myattr">second calculated value</xsl:attribute> 
    </myelem> 
</xsl:template> 

Gibt es eine Möglichkeit für die zweite bis der zweite berechnete Wert auf das gleiche myattr Attribut in dem Knoten Ergebnis anhängen?

Ich habe gesehen, dass es möglich ist, eine Attributwertvorlage zu verwenden, wenn das Zielattribut in der Quell-XML ist, aber kann ich irgendwie auf den Wert des Attributs verweisen, das ich zuvor an den Ergebnisknoten angehängt habe?

Vielen Dank im Voraus!

Antwort

4

Ein Ansatz, den Sie verwenden könnten, besteht darin, einen Parameter zu Ihrer Hilfsvorlage hinzuzufügen, die Sie an den Attributwert anhängen.

<xsl:template name="helper"> 
    <xsl:param name="extra" /> 
    <xsl:attribute name="myattr">first calculated value<xsl:value-of select="$extra" /></xsl:attribute> 
</xsl:template> 

Dann können Sie einfach vorbei in Ihrem zweiten berechnen Wert als Parameter

<xsl:template match="/> 
    <myelem> 
    <xsl:call-template name="helper"> 
     <xsl:with-param name="extra">second calculated value</xsl:with-param> 
    </xsl:call-template> 
    </myelem> 
</xsl:template> 

Sie haben nicht, obwohl bei jedem Aufruf den param einzustellen. Wenn Sie nichts angehängt möchten, nur die Helfer Vorlage ohne Parameter aufgerufen, und wird nichts an den ersten berechneten Wert anhängen.

+0

Tolle Idee! Eine weitere Frage: Kann ich der Vorlage 'helper' weitere Parameter hinzufügen und möglicherweise mehr' 'Elemente im Aufruf verwenden? –

+0

(Beantworte meine eigene Frage :) Ja, man kann mehr Parameter verwenden. –

0

Try this:

<xsl:template name="helper"> 
    <xsl:attribute name="myattr">first calculated value</xsl:attribute> 
    </xsl:template> 
    <xsl:template match="/"> 
    <myelem> 
     <xsl:call-template name="helper" /> 
     <xsl:variable name="temp" select="@myattr"/> 
     <xsl:attribute name="myattr"> 
     <xsl:value-of select="concat($temp, 'second calculated value')" /> 
     </xsl:attribute> 
    </myelem> 
    </xsl:template> 
+3

Das wird nicht funktionieren - das 'select =" @ myattr "' wird in den Kontextknoten des Eingabebaums schauen, nicht in den Ausgabebaum. In diesem Fall ist dieser Knoten der Dokumentenstammknoten ('/'), der niemals irgendwelche Attribute haben kann. –

2

Der einfachste Ansatz, um die Verschachtelung ein wenig zu ändern wäre - haben die helper nur Textknoten erzeugen und die <xsl:attribute> in der anrufenden Vorlage setzen:

<xsl:template name="helper"> 
    <xsl:text>first calculated value</xsl:text> 
</xsl:template> 

<xsl:template match="/> 
    <myelem> 
    <xsl:attribute name="myattr"> 
     <xsl:call-template name="helper" /> 
     <xsl:text>second calculated value</xsl:text> 
    </xsl:attribute> 
    </myelem> 
</xsl:template> 

Diese wird myattr auf "erster berechneter Wert zweiter berechneter Wert" setzen - wenn Sie ein Leerzeichen zwischen "Wert" und "Sekunde" wollen, müssen Sie das innerhalb eines der <xsl:text> Elemente

einfügen
 <xsl:text> second calculated value</xsl:text> 
+0

Das ist eine gute Antwort, obwohl im realen Fall die 'Helfer'-Vorlage viele weitere Attribute hinzufügt, und im' '-Knoten kann 'myattr' nach bestimmten Berechnungen geändert werden oder nicht. Also, nette Idee, aber in meinem Fall nicht praktisch. –

0

Während es mehr oder weniger die gleiche Sache ist, würde ich die prägnantere Art des Erstellens einer Variablen bevorzugen, anstatt eine Hilfsschablone zu haben. Beachten Sie, dass Sie eine Vorlage aus xsl: variable für den komplizierteren Fall aufrufen können.

<xsl:template match="/"> 
    <myelem> 
    <xsl:variable name="first">first calculated value </xsl:variable > 
    <xsl:attribute name="myattr"> 
     <xsl:value-of select="concat($first, 'second calculated value')"/> 
    </xsl:attribute> 
    </myelem> 
</xsl:template> 
Verwandte Themen