2016-07-29 15 views
2

Ich habe string: $number=Twentyone one two three. Ich muss den Wert nach der Zeichenfolge one das ist two three abrufen. Ich habe die unten Xslt Abfrage geschrieben:XSLT substring-nach

substring-after($number,'one') 

die one two three zurückgibt.

Wie lautet die Abfrage, um die gesamte Zeichenfolge nur mit one exakt und dann two three zurückgeben?

Antwort

0

Wenn Sie eine XSLT 2.0 Prozessor wie die Frage verwenden markiert ist), sollten Sie in der Lage sein, dies leichter zu tun mit replace() ...

<xsl:value-of select="normalize-space(replace($number,'^.*one(.*)$','$1'))"/> 
0

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()]], 
     ' ') 
0

Es hängt alles davon ab, wie viel Sie wissen über die Eingabezeichenfolge. Wenn Sie im Voraus wissen, dass es $number=Twentyone one two three enthält, dann wissen Sie bereits, dass die Antwort two three ist, so dass Sie keine Anpassung vornehmen müssen. Aber vermutlich weißt du das nicht. Aber Sie müssen etwas darüber wissen, und wir können das Problem nicht lösen, ohne zu wissen, was. Dimitre hat angenommen, dass Sie die Zeichenkette nach dem letzten Vorkommen von "Eins" in der Eingabe haben wollen, aber ich kann nichts in Ihrer Frage sehen, um diese Schlussfolgerung zu rechtfertigen. Was würdest du wollen, wenn die Eingabe "einundzwanzig Knochen" wäre? Sie könnten (nach allem, was wir wissen) nach der Zeichenfolge nach dem ersten Vorkommen von "Eins" suchen, das von Leerzeichen umgeben ist. Oder für die Zeichenfolge, die dem ersten Wort folgt, das der englische Name einer einstelligen Zahl ist, oder für die Zeichenfolge nach dem ersten Wort, das drei Zeichen lang ist. Wir wissen es einfach nicht, und Sie können nicht erwarten, dass wir es erraten.