XSL-подстрока и indexOf - PullRequest
       1

XSL-подстрока и indexOf

22 голосов
/ 01 декабря 2010

Я новичок в XSLT.Интересно, можно ли выбрать подстроку элемента.Я пытаюсь разобрать канал RSS.Значение описания имеет больше текста, чем я хочу показать.Я хотел бы получить его подстроку на основе индекса некоторой подстроки.По сути, я хочу показать результат вызова подстроки, передавая indxOf ('some_substring') и длину в качестве параметров.Возможно ли это?

Из комментариев :

Я хочу выбрать текст строки, которая находится после появления подстроки

Ответы [ 5 ]

46 голосов
/ 01 декабря 2010

Непонятно, что именно вы хотите сделать с индексом подстроки [обновление: теперь стало понятнее - спасибо], но вы можете использовать функцию substring-after или substring-before:

substring-before('My name is Fred', 'Fred')

возвращает 'My name is '.

Если вам нужен более подробный контроль, функция substring() может принимать два или три аргумента: строка, начальный индекс, длина. Опустите длину, чтобы получить всю оставшуюся часть строки.

В XPath нет функции index-of() для строк (только для последовательностей в XPath 2.0). Вы можете использовать string-length(substring-before($string, $substring))+1, если вам конкретно нужна позиция.

Существует также contains($string, $substring). Все это документировано здесь . В XPath 2.0 вы можете использовать сопоставление регулярных выражений.

(XSLT в основном использует XPath для выбора узлов и обработки значений, так что на самом деле это больше вопрос XPath. Я отметил его таким образом.)

9 голосов
/ 22 мая 2013

Вот некоторые выражения liner xpath 1.0 для IndexOf ($ text, $ searchString):

Если вам нужна позиция символа FIRST искомой строки, или 0, еслиего нет:

contains($text,$searchString)*(1 + string-length(substring-before($text,$searchString)))

Если вам нужна позиция первого символа ПОСЛЕ найденной строки, или 0 , если ее нет:

contains($text,$searchString)*(1 + string-length(substring-before($text,$searchString)) + string-length($searchString))

В качестве альтернативы, если вам нужна позиция первого символа ПОСЛЕ найденной строки, или длина + 1 , если ее нет:

1 + string-length($right) - string-length(substring-after($right,$searchString))

Это должно охватывать большинство случаев, в которых вы нуждаетесь.

Примечание: Умножение на содержит (...) приводит к преобразованию истинного или ложного результата функции contains (...) в 1 или0, который элегантно обеспечивает «0, когда не найден» часть логики.

7 голосов
/ 01 декабря 2010

Я хочу выбрать текст строки, которая находится после появления подстроки

Вы можете использовать:

substring-after($string,$match)

Если вы хотите подстрокуиз приведенного выше с некоторой длиной, то используйте:

substring(substring-after($string,$match),1,$length)

Но проблемы начинаются, если вхождение соответствующей подстроки не возникает ... Итак, если вы хотите, чтобы подстрока определенной длины находилась после появления подстрокиили из всей строки, если совпадений нет, вы можете использовать:

substring(substring-after($string,substring-before($string,$match)),
          string-length($match) * contains($string,$match) + 1,
          $length) 
5 голосов
/ 27 октября 2012

Ниже приведен полный пример, содержащий как XML, так и XSLT, где используются substring-before и substring-after

<?xml version="1.0" encoding="UTF-8"?>
<persons name="Group_SOEM">
    <person>
        <first>Joe Smith</first>
        <last>Joe Smith</last>
        <address>123 Main St, Anycity</address>
    </person>
</persons>    

Ниже приводится XSLT, который изменяет значение имени / фамилии путем разделения значенияпробел, так что после применения этого XSL первый элемент имени будет иметь значение «Джо» и последний «Смит».

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="first">
    <first>
        <xsl:value-of select="substring-before(.,' ')" />
    </first>
</xsl:template> 
<xsl:template match="last">
    <last>
        <xsl:value-of select="substring-after(.,' ')" />
    </last>
</xsl:template> 
<xsl:template match="@* | node()">
    <xsl:copy>
        <xsl:apply-templates select="@* | node()" />
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>   
2 голосов
/ 01 декабря 2010

В XSLT есть функция подстроки. Пример здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...