2013-01-02 7 views
6

Ist es möglich, den Typ eines Knotens, den ich mit einer Vorlage innerhalb der gleichen Vorlage abgestimmt? Falls ja, wie kann ich das machen? Zum Beispiel würde Ich mag so etwas tun:Überprüfen Sie den Knotentyp in XSL-Vorlage

<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 hat eine nette Antwort gegeben, aber ich frage mich, warum Sie dies innerhalb der Vorlage tun müssen und warum Sie nicht nur spezifischere Matchmuster mit separaten Vorlagen für die verschiedenen Knotentypen schreiben. –

+0

Ich interessiere mich für Bildungszwecke. Ich baue eine XSL-Transformation, um Knoten hervorzuheben, die mit XPath-Ausdrücken in einem XML-Dokument übereinstimmen. In einer tatsächlichen Anwendung würde ich es nicht tun. – hielsnoppe

Antwort

17

Werfen Sie einen Blick auf diese Antwort hier, da dies sollte Ihnen die Informationen geben, benötigen Sie:

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

Dies gibt die folgende xsl: Wählen Sie, um alle Knoten einschließlich des Dokumentknotens zu testen.

<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

Gut, aber Sie haben Namespace-Knoten verpasst. –

6

Eine genauere Art und Weise, um zu bestimmen, ob der Knoten $nodeein Knoten Wurzel ist:

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

Der Ausdruck in Antwort TimC ist der Typ des aktuellen Knotens testet:

count(.|/)=1 

ist aber nicht anwendbar in dem Fall, wenn wir den Typ eines Knotens in einer Variablen bestimmen wollen - die zu einem anderen Dokument gehören können - nicht zu dem aktuellen Dokument.

Auch ein Test für einen Namespace-Knoten:

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