XSLT, herauszufinden, ob das Letzte Kind Knoten ist ein besonderes element
Blick auf die folgenden zwei Beispiele:
<foo>some text <bar/> and maybe some more</foo>
und
<foo>some text <bar/> and a last <bar/></foo>
Gemischten text-Knoten und - bar
Elemente innerhalb der foo
element. Jetzt bin ich in foo
, und wollen herausfinden, ob das Letzte Kind ist ein bar
. Das erste Beispiel sollte sich als falsch, wie es der text nach der bar
, aber das zweite Beispiel sollte wahr sein.
Wie kann ich erreichen, das mit XSLT?
- Gute Frage (+1). Siehe meine Antwort für eine kurze Lösung und einen Schreibstil Vorschlag. 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wählen Sie einfach den letzten Knoten des
<foo>
element und verwenden Sie dannself
Achse zu lösen, die Knoten geben.Dieser XPath-Ausdruck gibt eine leere Menge (das entspricht false), wenn der Letzte Knoten ist nicht ein element. Wenn Sie möchten, um speziell zu bekommen Wert
true
oderfalse
, wickeln Sie diesen Ausdruck in der XPath-Funktionboolean()
. Verwendenself::*
stattself::bar
übereinstimmung mit jedem element als letzten Knoten.Eingabe-XML-Dokuments:
XSLT-Dokument Beispiel:
Ausgabe des stylesheet:
/foo/node()[last()]/self::bar
[last()]
Prädikat ist besserVerwenden:
Den booleschen Wert aller nicht-leeren node-set ist
true()
und es istfalse()
für sonst. Sie können den obigen Ausdruck direkt (unverändert) als der Wert dertest
Attribut einer<xsl:if>
oder<xsl:when>
.Besser, verwenden:
als
match
Attribut eines<xsl:template>
- so schreiben Sie in reinen "push" - Stil.Update: Diese Antwort Adressen der Anforderung angegeben in der original-Frage in der überschrift, "finden Sie heraus, wenn das Letzte Kind-Knoten ein Textknoten ist." Aber die Frage Körper schlägt einen anderen Anspruch, und es scheint, dass die letztere Bedingung war die eine bestimmt von der OP.
Den beiden vorherigen Antworten explizit testen, ob das Letzte Kind ist ein
bar
element, anstatt direkt testen, ob es ein Textknoten ist. Dies ist richtig, wenn foo enthält nur "gemischte text-nodes und bar-Elemente" und nie hat null Kinder.Aber Sie möchten vielleicht testen Sie direkt, ob das Letzte Kind ist ein text-Knoten:
Vielleicht kennen Sie den letzteren beiden wird nie auftreten, in Ihrem Fall (aber bei deiner Frage würde ich vermuten, dass die #3 könnte). Oder vielleicht denken Sie so, aber nicht sicher sind, oder vielleicht haben Sie noch nicht nachgedacht. In jedem Fall ist es sicherer, testen Sie direkt, was Sie wirklich wollen zu wissen:
Somit, aufbauend auf @Dimitre Beispiel-code und Eingabe, wird die folgende XML-Eingabe:
Mit dieser XSLT-Vorlage:
ergibt:
want to find out if the last child is a bar
.