В XSLT я могу токенизировать ни на чем? - PullRequest
5 голосов
/ 06 декабря 2011

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

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

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

Ответы [ 2 ]

5 голосов
/ 06 декабря 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(), мы затем соединяем все такие отдельные строки, используя предоставленный символ соединения "/".

2 голосов
/ 06 декабря 2011

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

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

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

a/b/c/d/e/f
...