2012-10-03 11 views
13

Il modello di identità si presenta così:Qual è la selezione predefinita di XSLT apply-templates?

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()" /> 
    </xsl:copy> 
</xsl:template> 

Does <xsl:apply-templates select="@*|node()" /> selezionare più di <xsl:apply-templates />, o potrebbe il modello di identità sono stati in questo modo?

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates /> 
    </xsl:copy> 
</xsl:template> 

Cosa viene selezionato esattamente quando eseguo quanto segue?

<xsl:apply-templates /> 

risposta

16

Does <xsl:apply-templates select="@*|node()" /> selezionare più di <xsl:apply-templates />, o potrebbe il modello di identità sono stati come questo?

<xsl:apply-templates/> 

è equivalente a:

<xsl:apply-templates select="node()"/> 

e questo è un ex più breve:

<xsl:apply-templates select="child::node()"/> 

e questo è un equivalente a:

<xsl:apply-templates select="* | text() | comment() | processing-instruction()"/> 

Come noi vediamo e da l'ultima istruzione, l'istruzione xsl:apply-templates ti stai chiedendo circa, non selezionare nessun attributo, quindi non può essere usato come una scorciatoia per:

<xsl:apply-templates select="@*|node()"/> 
+0

@OP: P.S. questo è definito in http://www.w3.org/TR/xslt#section-Applying-Template-Rules: "In assenza di un attributo select, l'istruzione xsl: apply-templates elabora tutti i figli dell'attuale nodo, compresi i nodi di testo. ... "Notare che i nodi di attributo sono * non * considerati figli del loro elemento genitore. – LarsH

+0

@LarsH, Sì, ma a volte i lettori trovano citando le Specifiche per "intimidire" :) –

+0

Sì, se dovessi scegliere tra solo quotare la Spec e solo spiegare cosa significa, sceglierei la tua risposta (a meno che non pensassi il le implicazioni delle specifiche erano molto facili da capire su questo punto).Tuttavia, in combinazione con una spiegazione utile, penso che indirizzare gli utenti verso il materiale primario li aiuti "a imparare a pescare". L'OP qui sembra essere un programmatore esperto, che non dovrebbe avere paura delle specifiche. :-) – LarsH

4

Il valore predefinito selezionare per <xsl:apply-templates/> è solo "node()", non include gli attributi.

+0

Ah, quindi ha perfettamente senso :) – Svish

1

Il default selection of apply-templates è node(), che è una scorciatoia per child::node(). Le espressioni XPath vengono valutate come segue:

  • Innanzitutto, vengono presi tutti i nodi dal "figlio" axis. Questi sono tutti i figli diretti dell'elemento corrente, ad esempio altri elementi, testo e commenti, ma non gli attributi.
  • Quindi questo set di nodi viene filtrato con "node test" node() ". In questo caso, nessun elemento viene filtrato perché quel test corrisponde a tutto.

Quindi con <xsl:apply-templates />, i modelli per gli elementi figli vengono applicati ma non per gli attributi. Nel caso del modello di copia ciò significherebbe che gli attributi non vengono copiati.

Problemi correlati