XSLT, um herauszufinden, ob der letzte untergeordnete Knoten ein bestimmtes Element ist

8

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?

    
Johan 03.10.2010, 22:17
quelle

3 Antworten

12

Wählen Sie einfach den letzten Knoten des Elements <foo> und verwenden Sie anschließend self axis, um den Knotentyp aufzulösen.

%Vor%

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%     
jasso 03.10.2010, 22:44
quelle
7
  

Jetzt bin ich in foo und möchte finden   aus, wenn das letzte Kind ein bar

ist

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.

    
Dimitre Novatchev 04.10.2010 00:14
quelle
5

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:

  1. Zur besseren Lesbarkeit der Stylesheet-Logik
  2. Falls das Element neben Elementen und Text noch andere Kinder enthält: z. Kommentare oder Verarbeitungsanweisungen
  3. Falls das Element keine Kinder hat

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%     
LarsH 04.10.2010 09:42
quelle

Tags und Links