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

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

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

Beitrag 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.
Ohne Input kein Output.
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

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

Beitrag 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ß ...
Ohne Input kein Output.
Antworten