我需要将字符串'abcdef'转换为其部分'a','b','c','d','e','f'。愚蠢的我试过了 tokenize('abcdef','') 但当然会返回FORX0003错误(tokenize()中的正则表达式不能是与零长度字符串匹配的表达式。)
我实际上是在尝试将字符串最终转换为'a / b / c / d / e / f',因此任何可以让我直接进入此状态的快捷方式也会很有用。
(我正在使用Saxon 9.3 for .NET平台)
答案 0 :(得分:5)
要从字符串$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()
然后我们使用提供的join-character“/".
答案 1 :(得分:2)
使用此行:
replace(replace($input, "(.)", "$1/", "s"), "(.*).$", "$1", "s")
$input
指向原始字符串的位置。返回此行是您想要的字符串。
a/b/c/d/e/f