2013-01-02 17 views
6

È possibile verificare il tipo di nodo che ho abbinato a un modello all'interno dello stesso modello? Nel caso lo sia, come posso farlo? Per esempio mi piacerebbe fare qualcosa di simile:Controllare il tipo di nodo nel modello XSL

<xsl:template match="@*|node()"> 
    <xsl:choose> 
     <xsl:when test="current() is an attribute"> 
     <!-- ... --> 
     </xsl:when> 
     <xsl:when test="current() is an element"> 
     <!-- ... --> 
     </xsl:when> 
     <xsl:otherwise> 
     <!-- ... --> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
+1

Tim ha dato una bella risposta, ma mi chiedo perché è necessario farlo all'interno del modello e perché non si scrivono schemi di corrispondenza più specifici con modelli separati per i diversi tipi di nodo. –

+0

Mi interessa per scopi didattici. Sto costruendo una trasformazione XSL per evidenziare i nodi corrispondenti alle espressioni XPath in un documento XML. In un'applicazione reale non lo farei. – hielsnoppe

risposta

17

Date un'occhiata a questa risposta qui, in quanto questo dovrebbe darvi le informazioni necessarie:

Difference between: child::node() and child::*

Questo dà il seguente xsl: scegliere per testare tutti i nodi, incluso il nodo del documento.

<xsl:choose> 
    <xsl:when test="count(.|/)=1"> 
    <xsl:text>Root</xsl:text> 
    </xsl:when> 
    <xsl:when test="self::*"> 
    <xsl:text>Element </xsl:text> 
    <xsl:value-of select="name()"/> 
    </xsl:when> 
    <xsl:when test="self::text()"> 
    <xsl:text>Text</xsl:text> 
    </xsl:when> 
    <xsl:when test="self::comment()"> 
    <xsl:text>Comment</xsl:text> 
    </xsl:when> 
    <xsl:when test="self::processing-instruction()"> 
    <xsl:text>PI</xsl:text> 
    </xsl:when> 
    <xsl:when test="count(.|../@*)=count(../@*)"> 
    <xsl:text>Attribute</xsl:text> 
    </xsl:when> 
</xsl:choose> 
+1

Buono, ma ti sei perso i nodi del namespace. –

6

Un modo più preciso per determinare se il nodo $node è un nodo radice:

not(count($node/ancestor::node())) 

L'espressione in risposta TimC prove, il tipo del nodo corrente:

count(.|/)=1 

ma non è applicabile nel caso in cui si voglia determinare il tipo di nodo in una variabile - che può appartenere a un altro documento - non al documento corrente.

Inoltre, un test per un nodo di spazio dei nomi:

count($node | $node/../namespace::*) = count($node/../namespace::*)