2009-02-26 12 views
6

Mi sembra impossibile ottenere-param per lavorare con i modelli di applicazione. Ad esempio, ho violato gli esempi riportati in w3schools.Perché non riesco a far funzionare i parametri con apply-templates in XSL?

xsl

<xsl:template match="/"> 
    <xsl:apply-templates> 
    <xsl:with-param name="test" select="'has this parameter been passed?'"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="cd"> 
    <xsl:param name="test"></xsl:param> 
    parameter: 
    <xsl:value-of select="$test"></xsl:value-of> 
</xsl:template> 

xml

<catalog> 
    <cd> 
    <title>Empire Burlesque</title> 
    <artist>Bob Dylan</artist> 
    <country>USA</country> 
    <company>Columbia</company> 
    <price>10.90</price> 
    <year>1985</year> 
    </cd> 
    <cd> 
    <title>Hide your heart</title> 
    <artist>Bonnie Tyler</artist> 
    <country>UK</country> 
    <company>CBS Records</company> 
    <price>9.90</price> 
    <year>1988</year> 
    </cd> 
</catalog> 

(si spera) vedrete che il parametro di prova non viene passata al template cd. Posso farlo funzionare quando uso call-template, ma non apply-templates. Cosa sta succedendo? Sto usando XSL 1.0. Si prega di ignorare il fatto che sto passando un parametro hard-coded - questo è solo un esempio.

risposta

5

Hmmm ... interessante ... non riesce per me utilizzando XslTransform e XslCompiledTransform in .NET - ma sembra che sia dovrebbe lavoro ... curioso ...

aggiornamento il problema vede essere la corrispondenza radice; prova

<xsl:template match="/catalog"> <!-- CHANGE HERE --> 
    <xsl:apply-templates> 
    <xsl:with-param name="test" select="'has this parameter been passed?'"/> 
    </xsl:apply-templates> 
</xsl:template> 

Questo quindi funziona per me senza altre modifiche. La differenza è che stavi abbinando il nodo radice. Quando hai eseguito i tuoi "modelli di applicazione", è stato possibile collegare in cascata per il primo al catalogo (con il parametro), quindi su cd (senza il parametro). Per ottenere quello che vuoi, devi iniziare dal catalogo. Puoi vedere questo aggiungendo un <xsl:vaue-of select="name()"/> alla partita, e poi provalo come "/" e "/ catalog".

+0

sì - funziona ma perché l'esempio originale non funziona !? – Goran

+0

Ahh. Ma perché il parametro non viene passato al cd? Il catalogo – darasd

+0

è la radice qui, quindi l'esempio originale dovrebbe funzionare. E lo fa con libXSLT e Opera. – vartec

2

provare a specificare i modelli da applicare:

<xsl:template match="/"> 
    <xsl:apply-templates select="catalog/cd"> 
    <xsl:with-param name="test" select="'has this parameter been passed?'"/> 
    </xsl:apply-templates> 
</xsl:template> 
+0

didn non capirlo - prova questa soluzione. Sembra che qualcosa vada storto quando non si specifica il percorso dei template. – Goran

+0

sì, hai ragione. Comunque, credo che avere // nella selezione sia una cattiva forma. Inoltre, sembra che questa doppia barra sia crutiale ai parametri di passaggio. Nel mio codice reale, stavo già passando un nodo nella selezione, tuttavia, il parametro è stato passato solo dopo aver prefisso il nodo con //. PERCHÉ? – darasd

+0

Ok - ora SO si sta comportando in modo strano - questa domanda non ha 4 risposte anche le tue modifiche vengono mostrate e poi vengono perse casualmente ... – Goran

0

Opere per me con libxslt 1.1.24 da http://xmlsoft.org/XSLT/ :

$ xsltproc xml1.xsl xml1.xml 
<?xml version="1.0"?> 


    parameter: 
    has this parameter been passed? 

    parameter: 
    has this parameter been passed? 
+0

interessante. Sto usando MSXML 4.0. Tuttavia, non funziona anche quando lo visualizzo in Firefox. – darasd

+0

Sì, fallisce con Fx, funziona con Opera 10. – vartec

0

Vedo che il problema è che non c'è corrispondenza per cd elemento nella radice. Sotto radice avete catalogo elemento non un cd elemento , in modo da modificare il modello per abbinare = 'catalogo'

2

si può sempre andare con xsl: call-template .. ad esempio:

... 
<xsl:call-template name="foo"> 
    <xsl:with-param name="bars" select="42"/> 
</xsl:call-template> 
... 

<xsl:template name="foo"> 
    <xsl:param name="bars"/> 
    <xsl:value-of select="$node"/> 
</xsl:template> 
Problemi correlati