2012-03-30 15 views
17

Was ist in XSLT 1.0 der kürzeste/sauberste/empfohlene Weg, um den aktuellen Kontextknoten an eine aufgerufene Vorlage zu übergeben und diesen Knoten zum Kontextknoten innerhalb der aufgerufenen Vorlage zu machen?XSLT Aktuellen Kontext in Call-Vorlage übergeben

Es wäre schön (würde es, richtig?) Wenn eine Vorlage ohne xsl: param und durch eine leere Call-Vorlage aufgerufen würde einfach den Kontextknoten des Aufrufers abholen, aber das Beste, was ich mir vorstellen kann, ist dies:

<xsl:call-template name="sub"> 
     <xsl:with-param name="context" select="." /> 
    </xsl:call-template> 

mit

<xsl:template name="sub"> 
    <xsl:param name="context" /> 
    <xsl:for-each select="$context"> 

    </xsl:for-each> 
</xsl:template> 

Antwort

22

es wäre schön, (wäre es, nicht wahr?), wenn eine Vorlage ohne xsl:param und durch einen leeren call-template genannt einfach würde holen die Context-Knoten des Aufrufers.

Dies ist genau das, wie in der W3C xsl:call-template XSLT 1,0 (und 2,0) Spezifikation definiert ist, und durch jeden konformen XSLT-Prozessor implementiert.

Hier ist ein kleines Beispiel:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 

<xsl:template match="a"> 
    <xsl:call-template name="currentName"/> 
</xsl:template> 

<xsl:template name="currentName"> 
    Name: <xsl:value-of select="name(.)"/> 
</xsl:template> 
</xsl:stylesheet> 

Wenn diese Transformation auf die folgende XML-Dokument angewendet wird:

<t> 
<a/> 
</t> 

das gewünschte, wird korrektes Ergebnis hergestellt:

Name: a 
+0

Danke Dimitre. Ich habe das nicht dokumentiert und es schien nicht zu funktionieren, als ich es versuchte. Ich habe nicht an der richtigen Stelle gesucht und muss etwas anderes falsch gemacht haben. +1 Q hat geantwortet. Prost. – JPM

+0

@JPM: Gern geschehen. Möglicherweise haben Sie sich die Anweisung xsl: function in XSLT 2.0 angesehen - sie unterscheidet sich von einer benannten Vorlage dadurch, dass sie nicht den Kontext des Aufrufers der Funktion empfängt und der Aufrufer seinen Kontextknoten übergeben muss als Parameter, wenn dieser Kontextknoten übergeben werden muss. –

4

Nur anders zu erklären, was Dimitre gesagt hat.

Wenn Sie eine Vorlage von einem Knoten nennen, sind Sie schon da in diesem Knoten,

Beispiel:

diesen Code übernehmen:

<xsl:template match="MyElement"> 
    <xsl:call-template name="XYZ"/> 
</xsl:template> 

<xsl:template name="XYZ> 
    <xsl:value-of select="."/> 
</xsl> 

Der obige Code ist so gut wie das Schreiben :

<xsl:template match="MyElement"> 
    <xsl:value-of select="."/> 
</xsl:template> 

Sie können for-each-Schleife auch in der aufgerufenen Vorlage verwenden. :)

Aber nur sicher sein, wo Sie genau sind ..

Verwandte Themen