Sehen Sie sich die folgenden zwei Beispiele an:
%Vor%und
%Vor% Gemischte Textknoten und bar
-Elemente im foo
-Element. Jetzt bin ich in foo
und möchte herausfinden, ob das letzte Kind ein bar
ist. Das erste Beispiel sollte sich als falsch herausstellen, da nach dem bar
Text vorhanden ist, aber das zweite Beispiel sollte wahr sein.
Wie kann ich dies mit XSLT erreichen?
Wählen Sie einfach den letzten Knoten des Elements <foo>
und verwenden Sie anschließend self
axis, um den Knotentyp aufzulösen.
Dieser XPath-Ausdruck gibt eine leere Menge zurück (was boolescher falscher Wert entspricht), wenn der letzte Knoten kein Element ist. Wenn Sie den Wert true
oder false
gezielt erhalten möchten, umschließen Sie diesen Ausdruck in der XPath-Funktion boolean()
. Verwenden Sie self::*
anstelle von self::bar
, um ein beliebiges Element als letzten Knoten zu finden.
XML-Eingabedokument:
%Vor%XSLT Dokument Beispiel:
%Vor%Ausgabe des Stylesheets:
%Vor%Jetzt bin ich in
istfoo
und möchte finden aus, wenn das letzte Kind einbar
Verwenden Sie :
%Vor% Der boolesche Wert eines nicht leeren Knotensatzes ist true()
und andernfalls false()
. Sie können den obigen Ausdruck direkt (unmodifiziert) als Wert des Attributs test
eines beliebigen <xsl:if>
oder <xsl:when>
verwenden.
Besser, verwenden Sie :
%Vor% als das match
Attribut eines <xsl:template>
- also schreibst du im reinen "Push" Stil.
Update: Diese Antwort bezieht sich auf die Anforderung, die im ursprünglichen Fragentitel angegeben ist, "herauszufinden, ob der letzte untergeordnete Knoten ein Textknoten ist". Aber der Fragekörper schlägt eine andere Anforderung vor, und es scheint, dass die letzte Anforderung die vom OP beabsichtigte war.
Die vorherigen zwei Antworten testen explizit, ob das letzte Kind ein bar
Element ist, anstatt direkt zu testen, ob es sich um einen Textknoten handelt. Dies ist korrekt, wenn foo nur "gemischte Textknoten und Balkenelemente" enthält und niemals null untergeordnete Elemente hat.
Vielleicht möchten Sie aber direkt testen, ob das letzte Kind ein Textknoten ist:
Vielleicht wissen Sie, dass die letzten beiden in Ihrem Fall nie vorkommen werden (aber von Ihrer Frage würde ich denken, dass # 3 könnte). Oder denken Sie vielleicht, sind sich aber nicht sicher, oder vielleicht haben Sie nicht darüber nachgedacht. In jedem Fall ist es sicherer, direkt zu testen, was Sie wirklich wissen möchten:
%Vor%Aufbauend auf @ Dimitres Beispielcode und Eingabe die folgende XML-Eingabe:
%Vor%Mit dieser XSLT-Vorlage:
%Vor%ergibt:
%Vor%