2012-03-30 12 views
17

In XSLT 1.0, qual è il modo più breve/pulito/consigliato per passare il nodo di contesto corrente a un modello chiamato e fare in modo che quel nodo diventi il ​​nodo di contesto all'interno del modello chiamato?XSLT Passare contesto corrente nel modello di chiamata

Sarebbe bello (sarebbe, giusto?) Se un modello senza xsl: param e chiamato da un modello di chiamata vuoto avrebbe semplicemente raccolto il nodo di contesto del chiamante, ma il meglio che posso pensare è questo:

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

con

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

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

risposta

22

sarebbe bello (che sarebbe, giusto?) se un modello senza xsl:param e chiamato da un vuoto call-template sarebbe semplicemente prendere il nodo di contesto del chiamante.

Questo è esattamente come xsl:call-template è definito nella specifica W3C XSLT 1.0 (2.0), e attuato da qualsiasi processore XSLT conforme.

Ecco un piccolo esempio:

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

Quando questa trasformazione viene applicata sul seguente documento XML:

<t> 
<a/> 
</t> 

la desiderata, risultato corretto viene prodotto:

Name: a 
+0

Grazie Dimitre. Non ho visto questo documentato e non sembrava funzionare quando ho provato. Non stavo cercando nel posto giusto e dovevo fare qualcosa di sbagliato. +1 Q ha risposto. Saluti. – JPM

+0

@JPM: prego. Potresti aver osservato l'istruzione 'xsl: function' in XSLT 2.0 - è diversa da un modello con nome in quanto non riceve il contesto del chiamante della funzione e se il chiamante deve passare il suo nodo di contesto come parametro, se questo nodo di contesto deve essere passato. –

4

Solo in un altro modo di spiegare cosa diceva Dimitre.

Quando si chiama un modello da un nodo, sei già lì in quel nodo,

esempio:

assumere questo codice:

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

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

Il codice di cui sopra è buono come la scrittura :

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

È possibile utilizzare anche per ogni ciclo nel modello chiamato. :)

Ma assicurati solo dove sei esattamente ..

Problemi correlati