在XSLT中我可以无标记吗?

时间:2011-12-06 12:15:34

标签: xslt xslt-2.0

我需要将字符串'abcdef'转换为其部分'a','b','c','d','e','f'。愚蠢的我试过了     tokenize('abcdef','') 但当然会返回FORX0003错误(tokenize()中的正则表达式不能是与零长度字符串匹配的表达式。)

我实际上是在尝试将字符串最终转换为'a / b / c / d / e / f',因此任何可以让我直接进入此状态的快捷方式也会很有用。

(我正在使用Saxon 9.3 for .NET平台)

2 个答案:

答案 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