2016-07-29 3 views
2

У меня есть строка: $number=Twentyone one two three. Мне нужно получить значение после строки one, которая равна two three. Я написал ниже XSLT-запрос:XSLT подстрока-после

substring-after($number,'one') 

который возвращает one two three.

Каков запрос, который точно соответствует всей строке только с one, а затем возвращается two three?

ответ

0

Если вы используете XSLT 2.0 процессор, как вопрос маркированный), вы должны быть в состоянии сделать это проще с replace() ...

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

Это выражение XPath 2.0:

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') 
            ) 
        ) 
           ) 

при оценке производит строку:

«two three»


Объяснение:

Проблема заключается в том, чтобы найти подстроку после последнего появления строки «один» в исходной строке.

Одним из решений является найти подстроку перед строкой «eno» (обратная сторона «один») в исходной исходной строке - затем отмените результат.

В XPath 2.0 есть стандартная функция reverse(), которая производит из последовательности другую, которая является обратной исходной последовательностью. Существует также стандартная функция XPath 2.0 string-to-codepoints(), которая из строки создает последовательность кодовых точек (думаю, Unicode «коды символов»), которые содержат эту строку. И наоборот, стандартная функция XPath 2.0 codepoints-to-string() принимает последовательность действительных кодовых точек Unicode (целые числа) и создает строку, состоящую из этих кодовых точек.

Таким образом, выражение XPath 2.0, который производит обратную строку $vS является:

codepoints-to-string(reverse(string-to-codepoints($vS))) 

Используя эти знания, мы можем построить выражение в XPath 2.0 выше, которое обеспечивает желаемое решение.

Даже в более общем:

Чтобы найти подстроку $vS после последнего появления $vS2 в нем, используйте это выражение XPath 2.0:

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.Альтернативное решение - если нужны только слова после последнего вхождения строки

Если вам нужна только последовательность возвращающих слов после последнего вхождения конкретной строки («одна») - без точных разделителей, вы можете использовать этот XPath 2.0 выражение:

for $vS in 'Twentyone one two three' 
    return 
    tokenize($vS, '\W')[position() > index-of(tokenize($vS, '\W'), 'one')[last()]] 

В случае, если нет необходимости последовательность завершающих слов, но их конкатенации (с использованием стандартного разделителя, например, пространство), использование:

for $vS in 'Twentyone one two three' 
    return 
    string-join(
     tokenize($vS, '\W')[position() > index-of(tokenize($vS, '\W'), 'one')[last()]], 
     ' ') 
0

Все зависит от того, сколько вы знаете о входной строке. Если вы заранее знаете, что он содержит $number=Twentyone one two three, то вы уже знаете, что ответ two three, поэтому вам не нужно выполнять какие-либо сопоставления. Но, по-видимому, вы этого не знаете. Но вы должны что-то знать об этом, и мы не можем решить проблему, не зная, что. Dimitre предположил, что вы хотите строку после последнего появления «одного» во входе, но я не вижу ничего в вашем вопросе, чтобы оправдать этот вывод. Что бы вы хотели, если бы вход был «двадцать одна кость»? Вы можете (насколько нам известно) искать строку после первого появления «одного», окруженного пробелами. Или для строки, которая следует за первым словом, которое является английским именем однозначного числа, или для строки после первого слова длиной в три символа. Мы просто не знаем, и вы не можете ожидать, что нас угадают.

Смежные вопросы