2017-07-20 4 views
2

Ich brauche einen einzelnen XPath-Ausdruck, um beliebigen Text vor einem Knoten unabhängig von Struktur und Hierarchie auszuwählen. Zum Beispiel, wie entpacke ich Text vor dem Knoten <target/> in den folgenden Fällen:Wie extrahiere ich einen Text vor einem bestimmten Knoten mit XPath 1.0?

Fall 1:

<a>1</a> 
<b>2</b> 
<target/> 

Erwartetes Ergebnis: 2

Fall 2:

<p>1</p> 
<do> 
    <bt>2</bt> 
</do> 
<target/> 

Erwartetes Ergebnis: 2

Fall 3:

<aa>Text <b>child text</b></aa> 
<target/> 

Erwartetes Ergebnis: 'Kinder Text' oder 'Text Kind Text'

Fall 4:

<p>Text <b>child text</b> tail</p> 
<target/> 

Erwartetes Ergebnis: 'Schwanz', 'Text Schwanz' oder 'Text Kind Text tail'

Und so weiter, kann es so viele Fälle wie möglich sein. Eigentlich ist alles, was ich will, das letzte Zeichen des vorhergehenden Textes, also ist es egal, ob das Ergebnis Text von irgendwelchen verschachtelten zwischengeordneten Kindelementen enthält.

Antwort

3
//target/preceding::text()[normalize-space(.) != ''][1] 

[1] statt [last()] weil vorhergehende die Knoten zurückführt. Und [normalize-space (.)! = ''], Weil wir keine Textknoten wollen, die nur aus Leerzeichen bestehen.

+1

Sie sollten auch in der Lage sein, 'normalize-space (.)! = ''' Auf 'normalize-space() 'zu verkürzen. –

Verwandte Themen