Seite 1 von 1

[XSL/XPATH] Ist das folgende Elemente von Typ X?

Verfasst: 23.11.2012, 12:31
von BeRsErKeR
Hallo ich möchte ein XML in ein anderes XML transformieren mit Saxon + XSL.

Im Quell-XML gibt es das Tag "lText", was einem Listeneintrag entspricht. Es gibt leider kein übergeordnetes Listen-Tag o.ä. und ich kann das Quell-XML nicht anpassen. Ich möchte nun prüfen ob nach dem aktuellen lText-Tag kein weiteres kommt. Das Problem ist, dass zwischen lText-Tags auch einfach Text stehen kann (ohne Tags), der dann quasi zwischen zwei Listen steht.

Folgendes geht daher nicht in jedem Fall:

Code: Alles auswählen

<xsl:if test="not(following-sibling::*[1]/name() = 'lText')">
Weil der * nur Elemente, also keine Text-Nodes berücksichtigt. Wenn ich anstatt des * ein node() nehme, klappt es auch nicht. Ich vermute weil dazwischen halt noch Whitespace sind und node() auch Whitespace-Nodes erfasst.

Mein aktueller Versuch ist:

Code: Alles auswählen

<xsl:if test="count(following-sibling::lText) = 0 or not((following-sibling::* | following-sibling::text())[1]/name() = 'lText')">
Die zweite Bedingung ist eigentlich entscheidend. Leider ist die Bedingung immer erfüllt, auch wenn nach einem lText-Tag ein weiteres folgt (mit Whitespaces dazwischen). Kann mir da jemand helfen? Wichtig ist wie gesagt, dass die nächste Node (die ein Tag oder eine Text-Node ist) kein lText-Tag sein soll, damit die Bedingung erfüllt wird.

Re: [XSL/XPATH] Ist das folgende Elemente von Typ X?

Verfasst: 23.11.2012, 15:13
von BeRsErKeR
Ok folgender Ausdruck scheint zu funktionieren:

Code: Alles auswählen

<xsl:if test="count(following-sibling::lText) = 0 or (following-sibling::node()[1]/self::text() and string-length(following-sibling::node()[1]) > 1) or not(following-sibling::*[1]/self::lText)">
Etwas umständlich, aber scheinbar werden Zwischenräume mit Whitespaces als Text-Nodes mit einem Leerzeichen interpretiert. Was fürn Scheiß ...