Hallo,
Ich habe einen Knoten, der entweder so <Text/> oder so <Text></Text> oder so <Text>etwas text</Text> vorkomment. Ich moechte nun mit Xpath anweisung nur auf letzteren Knoten "zielen". nun meine Frage, warum ist
"Root[Text/text() != '']" nicht gleich "Root[not(Text/text() = '')]" ??
Root[Text/text() != '']: hier wird vergleichst du den text()-Knoten, wenn das Element leer ist, gibt es aber keinen text()-Knoten. Du testest explizit das Vorhandensein eines text-Knoten.
Root[not(Text/text() = '')]: hier vergleichst du ob in einem Text dessen text()-Knoten leer sei, dass kann aber auch dann sein, wenn das Elemente leer ist (sprich wenn es keinen text()-Knoten hat: der Test ergibt dann 0 bzw. eben "leer")
bei:
<data>
- <text></text>
- <text />
- <text>bla bla</text>
</data>
ergibt ein Vergleich mit data[text/text() != ''] bzw. mit data[not(text/text() = '')] folgende Trefferquote:
- data[not(text/text() = '')]
- data[not(text/text() = '')]
- data[text/text() != '']
Oder wie gehe ich sicher, dass ich alle leeren Knoten ausschliesse?
Root[Text != '']
PS: text() ist noch(?) nicht in den XPath-Funktionen bei selfhtml.org aufgeführt
Weil text() ebenso wie node(), comment() und processing-instruction() keine Funktion, sondern ein Knotentest ist. text() selektiert alle Textknoten an der relevanten Achse, so wie node() alle Knoten an der relevanten Achse selektiert.
Grüße
Thomas