В XSLT я могу токенизировать ничего?

Мне нужно преобразовать строку 'abcdef' в ее части: 'a', 'b', 'c', 'd', 'e', ​​'f'. По глупости я попытался использовать tokenize('abcdef', ''), но, конечно же, это возвращает ошибку FORX0003 (регулярное выражение в tokenize() не должно совпадать со строкой нулевой длины).

На самом деле я пытаюсь окончательно преобразовать строку в «a/b/c/d/e/f», поэтому любые ярлыки, которые могли бы привести меня непосредственно к этому состоянию, также будут полезны.

(Я использую Saxon 9.3 для платформы .NET)


person ͢bts    schedule 06.12.2011    source источник


Ответы (2)


Используйте эту строку:

replace(replace($input, "(.)", "$1/", "s"), "(.*).$", "$1", "s")

Где $input указывает на исходную строку. Возврат этой строки является вашей желаемой строкой.

a/b/c/d/e/f
person FailedDev    schedule 06.12.2011

Чтобы получить нужную последовательность символов из строки $str, используйте пару функций string-to-code-points() и codepoints-to-string():

for $c in string-to-codepoints($str)
 return
    codepoints-to-string($c)

Чтобы получить эту последовательность символов, соединенную символом '/' в качестве строки соединения, просто примените string-join() в приведенном выше выражении.

Вот полный пример кода:

<xsl:stylesheet version="2.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

 <xsl:template match="/">
     <xsl:sequence select=
      "string-join(
              for $c in string-to-codepoints('ABC')
              return
                 codepoints-to-string($c),
            '/'
                     )
      "/>
 </xsl:template>
</xsl:stylesheet>

выдает требуемую последовательность символов:

A/B/C

Пояснение:

string-to-codepoints($str) создает последовательность кодовых точек (думайте о них как о «кодах символов»), представляющих каждый символ строки.

Например;

string-to-codepoints('ABC')

создает последовательность:

65 66 67

codepoints-to-string($code-seq)

является обратной функцией string-to-codepoints(). Учитывая последовательность кодовых точек, он создает строку, символы которой представлены кодовыми точками в последовательности. Таким образом:

codepoints-to-string((65,66,67))

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

ABC

Поэтому:

for $c in string-to-codepoints($str)
 return
    codepoints-to-string($c)

получает кодовую точку каждого отдельного символа в $str и преобразует его в отдельную строку.

Используя string-join(), мы затем соединяем все такие отдельные строки, используя предоставленный символ соединения "/".

person Dimitre Novatchev    schedule 06.12.2011
comment
Это решение работает отлично, но я принял ответ FailedDev, так как он короче и немного проще для (простых) людей (таких как я) для понимания. - person ͢bts; 06.12.2011