Dieser XPath 2.0-Ausdruck:
for $vS in 'Twentyone one two three'
return
codepoints-to-string(
reverse(
string-to-codepoints(
substring-before(
codepoints-to-string(
reverse(string-to-codepoints($vS))
),
'eno')
)
)
)
bei der Auswertung erzeugt den String:
"two three
"
Erklärung:
Das Problem ist, den Teil nach den letzten Vorkommen der Zeichenfolge "Eins" in der ursprünglichen Zeichenfolge zu finden.
Eine Lösung besteht darin, die Teilzeichenfolge vor der Zeichenkette "eno" (die Umkehrung von "Eins") in der umgekehrten ursprünglichen Zeichenkette zu finden - dann kehren Sie das Ergebnis um.
In XPath 2.0 gibt es eine Standardfunktion reverse()
, die aus einer Sequenz eine andere erzeugt, die die umgekehrte ursprüngliche Sequenz ist. Es gibt auch eine Standard-XPath 2.0-Funktion string-to-codepoints()
, die aus einer Zeichenfolge eine Sequenz der Codepoints (Think Unicode "Zeichencodes") erzeugt, die diese Zeichenfolge enthalten. Umgekehrt nimmt die Standard-XPath 2.0-Funktion codepoints-to-string()
eine Sequenz von gültigen Unicode-Codepoints (Ganzzahlen) und erzeugt die Zeichenfolge, die diese Codepunkte umfasst.
Daher ist es eine XPath 2.0-Ausdruck, der die Rückseite einer Saite erzeugt $vS
ist:
codepoints-to-string(reverse(string-to-codepoints($vS)))
dieses Wissen verwenden wir den XPath 2.0-Ausdruck oben konstruieren kann, dass die gewünschte Lösung.
Noch allgemein:
Um den Teil von $vS
nach dem letzten Auftreten von $vS2
darin zu finden, verwenden Sie diesen XPath 2.0-Ausdruck:
codepoints-to-string(
reverse(
string-to-codepoints(
substring-before(
codepoints-to-string(
reverse(string-to-codepoints($vS))
),
codepoints-to-string(reverse(string-to-codepoints($vS2))))
)
)
)
II.Alternative Lösung - wenn Sie nur die Wörter nach dem letzten Vorkommen eines Strings benötigen
Wenn Sie nur die Reihenfolge der nachgestellten Wörter nach dem letzten Vorkommen des bestimmten Strings ("eins") benötigen - ohne die genauen Trennzeichen, Sie können diesen XPath 2.0-Ausdruck verwenden:
for $vS in 'Twentyone one two three'
return
tokenize($vS, '\W')[position() > index-of(tokenize($vS, '\W'), 'one')[last()]]
Falls Sie brauchen nicht die Sequenz Worte Hinter, aber ihre Verkettung (ein Standard-Trennzeichen, wie ein Raum verwendet wird), zu verwenden:
for $vS in 'Twentyone one two three'
return
string-join(
tokenize($vS, '\W')[position() > index-of(tokenize($vS, '\W'), 'one')[last()]],
' ')