2010-06-27 12 views
46

Sto solo imparando l'XML e come utilizzare i file XSL. In un file XSL ho trovato la seguente termine:XSL xsl: modello match = "/"

xsl:template match="/" 

Che cosa significa questo per il supporto? E cosa potrei usare al posto di /? Posso scrivere table o qualsiasi altro tag HTML invece di /?

risposta

7

L'attributo di corrispondenza indica su quali parti verrà applicata la trasformazione del modello. In tal caso, "/" indica la radice del documento xml. Il valore che devi fornire nell'attributo della corrispondenza deve essere un'espressione XPath. XPath è la lingua che devi usare per riferire parti specifiche del file xml di destinazione.

Per ottenere una comprensione significativa di cos'altro è possibile inserire nell'attributo di corrispondenza, è necessario comprendere cosa xpath è e come utilizzarlo. Ti suggerisco di guardare i link che ti ho fornito per il fondo della risposta.

Posso scrivere "tabella" o qualsiasi altro tag html anziché "/"?

Sì, è possibile. Ma dipende da cosa esattamente stai cercando di fare. se il tuo file xml di destinazione contiene elementi HMTL e sei triyng per applicare questo xsl: template su di essi ha senso usare la tabella, div o l'altra alternativa.

Ecco alcuni link:

+2

Questa risposta non è effettivamente corretta. Non tutte le espressioni XPath possono essere specificate come pattern di corrispondenza legale. –

+1

Sono d'accordo ma secondo me è meglio per un principiante prendere in considerazione il modello di corrispondenza così come viene definito usando XPath. – Koynov

108

Il valore dell'attributo match dell'istruzione <xsl:template> deve essere un partita modello.

Gli schemi di corrispondenza formano un sottoinsieme dell'insieme di tutte le possibili espressioni XPath. La prima, naturale, limitazione è che un modello di corrispondenza deve selezionare un insieme di nodi. Ci sono anche altre limitazioni. In particolare, gli assi inversi non sono ammessi nelle fasi di localizzazione (ma possono essere specificati all'interno dei predicati). Inoltre, nessun riferimento a variabili o parametri è consentito in XSLT 1.0, ma l'utilizzo di questi è legale in XSLT 2.x.

/ in XPath indica la radice o il nodo del documento. In XPath 2.0 (e quindi XSLT 2.x) questo può anche essere scritto come document-node().

Un modello di corrispondenza può contenere // abbreviation.

Esempi di modelli di partita:

<xsl:template match="table"> 

può essere applicato su qualsiasi elemento denominato table.

<xsl:template match="x/y"> 

può essere applicato su qualsiasi elemento denominato y il cui genitore è un elemento di nome x.

<xsl:template match="*"> 

può essere applicato a qualsiasi elemento.

<xsl:template match="/*"> 

può essere applicato solo all'elemento superiore di un documento XML.

<xsl:template match="@*"> 

può essere applicato a qualsiasi attributo.

<xsl:template match="text()"> 

può essere applicato a qualsiasi nodo di testo.

<xsl:template match="comment()"> 

può essere applicato a qualsiasi nodo di commento.

<xsl:template match="processing-instruction()"> 

può essere applicato a qualsiasi nodo di istruzioni di elaborazione.

<xsl:template match="node()"> 

può essere applicato a qualsiasi nodo: elemento, testo, commento o istruzione di elaborazione.

+0

Che è stato utile conoscere ed è raramente menzionato in altre fonti: "Un nodo corrisponde a un modello se il nodo è un membro del risultato della valutazione del modello come espressione rispetto ad un possibile contesto, i possibili contesti sono quelli il cui contesto nodo è il nodo che corrisponde o uno dei suoi antenati. " (https://www.w3.org/TR/xslt#patterns) –

+0

@NiklasPeter, Sì, qui la Spec sta spiegando un po 'come vengono valutate le espressioni XPath - quindi dobbiamo dire che qualsiasi programmatore XSLT è previsto conoscere XPath? Penso che tutti siano abbastanza consapevoli di questo prerequisito. –

+0

Il motivo per cui ho aggiunto questa citazione è l'ultima parte: "i contesti possibili sono quelli il cui nodo di contesto è il nodo che corrisponde o uno dei suoi antenati".Penso che provare tutti i nodi degli antenati sia specifico per XSLT e non un fatto, che non tutti conoscono bene con XPath. –

34

Vale la pena notare, poiché confonde le persone nuove in XML, che la radice (o il nodo del documento) di un documento XML non è l'elemento di livello superiore. È il genitore dell'elemento di livello superiore. Ciò è fonte di confusione perché non sembra che l'elemento di livello superiore possa avere un genitore. Non è il livello più alto?

Ma guardare a questo, un documento XML ben formato:

<?xml-stylesheet href="my_transform.xsl" type="text/xsl"?> 
<!-- Comments and processing instructions are XML nodes too, remember. --> 
<TopLevelElement/> 

La radice di questo documento ha tre figli: un'istruzione di elaborazione, un commento e un elemento.

Così, per esempio, se si voleva scrivere una trasformazione che è sbarazzato di quel commento, ma ha lasciato in ogni osservazioni contenute in qualsiasi altra parte del documento, che ci si aggiunge questo all'identità transform:

<xsl:template match="/comment()"/> 

Anche più semplice (e più comunemente utile), ecco un modello XPath che corrisponde all'elemento di livello superiore del documento indipendentemente dal suo nome: /*.

+3

Ho trascorso una buona parte di questa mattina completamente sconcertato da questa dicotomia documento/radice. Sto usando XML e DOM da anni, ma continuo a saltare su cose come questa! –

+1

Grazie per avermi fatto entrare in questa sottile ma elementare distinzione di cui non ero a conoscenza da troppo tempo! :) – Chris