2012-01-12 11 views
8

Datovariabile in xsl: template pattern matching

Un foglio di stile XSLT con una variabile globale:

<xsl:variable name="lang" select="/response/str[@name='lang']"/> 

Domanda

Da dove viene la limitazione che utilizza variabili in predicati è errato nel modello di corrispondenza xsl:template, ma è accettabile in xsl:apply-templates selezionando il motivo?

<!-- throws compilation error, at least in libxslt --> 
<xsl:template match="list[@name='item_list'][$lang]"/> 

<!-- works as expected --> 
<xsl:template match="list[@name='item_list'][/response/str[@name='lang']]"/> 

<!-- works as expected --> 
<xsl:template match="response"> 
    <xsl:apply-templates select="list[@name='item_list'][$lang]"> 
</xsl:template> 
+0

Non sono sicuro che sia la limitazione, ma sei sicuro che il tuo '$ lang' contiene un valore stringa (o numerico) ma non un qualche set di nodi? – YuS

+0

@yuri, contiene un set di nodi, ma non vedo un motivo per cui un set di nodi non è consentito nel contesto. – newtover

+1

Non posso dire dettagli sul motivo per cui la restrizione è stata specificata in XSLT 1.0, ma posso dirti che è andata in XSLT 2.0, quindi potresti prendere in considerazione di passare a quella versione della lingua e una delle sue implementazioni come Saxon 9 o AltovaXML. –

risposta

10

Le variabili non possono essere utilizzati nelle espressioni partita in XSLT 1.0.

Dalla descrizione XSLT 1.0: Defining Template Rules

è un errore per il valore dell'attributo match per contenere un VariableReference.

Le variabili sono ammessi nelle espressioni di corrispondenza in XSLT 2.0.

Dalla descrizione XSLT 2.0: Syntax of Patterns

Patterns può iniziare con un id FO o funzione chiave, a condizione che il valore da abbinare sono forniti sia come letterale o un riferimento a una variabile o parametro, e il nome della chiave (nel caso della funzione chiave ) viene fornito come stringa letterale. Questi modelli non saranno mai corrispondono a un nodo in un albero la cui radice non è un nodo del documento.

+0

Grazie! Proprio prima di chiedere ho guardato esattamente quella sezione delle specifiche, ma in qualche modo trascurato la frase che hai citato. Ho bisogno di dormire meglio! – newtover

+1

@newtover: P.S. hai anche chiesto perché una variabile di riferimento "è accettabile in xsl: apply-templates selezionando il modello". La risposta è che la selezione in 'xsl: apply-templates' non è un pattern ma un'espressione XPath. I pattern assomigliano molto alle espressioni XPath ma non sono uguali. Questa limitazione di riferimento variabile è una differenza (in XSLT 1.0). – LarsH

+0

Mads, non penso che la tua affermazione su quando le variabili sono permesse nelle espressioni di corrispondenza è abbastanza accurata, basata sulla mia lettura delle specifiche. Penso che tu possa semplicemente dire "Le variabili sono permesse nelle espressioni di corrispondenza in XSLT 2.0" anche se si riferiscono a un nodo di documenti.È solo che i pattern contenenti le chiamate alle funzioni key() e id() non corrisponderanno mai a un nodo in un albero la cui radice non è un nodo del documento ... ma ciò non limita il valore di una variabile nel pattern. – LarsH