构造一个按字母顺序排列的序列

时间:2013-04-12 16:46:31

标签: xslt-2.0 xpath-3.0 xslt-3.0

这个XPath表达式:

for $n in 1 to 5 return $n

返回

  

1 2 3 4 5

是否可以用字母字符做类似的事情?

2 个答案:

答案 0 :(得分:2)

是的:

for $n in 65 to 70 return fn:codepoints-to-string($n)

返回:

A
B
C
D
E

至少在ascii / iso-8859-1中。

for $n in fn:string-to-codepoints('A') to fn:string-to-codepoints('E') 
    return fn:codepoints-to-string($n)

应该适用于任何语言环境。

答案 1 :(得分:2)

或者,在XPath 3.0(XSLT 3.0)中:

((32 to 127) ! codepoints-to-string(.))[matches(., '[A-Z]')]

在这里,我们不知道所需字符是否具有相邻字符代码(在许多实际情况下,它们不会)。

使用此XPath 3.0表达式进行的完整XSLT 3.0转换:

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

 <xsl:template match="/">
  <xsl:sequence select=
  "((32 to 127) ! codepoints-to-string(.))[matches(., '[A-Z]')]
  "/>
 </xsl:template>
</xsl:stylesheet>

在任何XML文档(未使用)上应用此转换(我使用Saxon-EE 9.4.0.6J)时,会生成所需的正确结果

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

如果我们知道想要的结果字符包含所有相邻的字符代码,那么:

(string-to-codepoints('A') to string-to-codepoints('Z')) ! codepoints-to-string(.)

<强>解释

使用新的XPath 3.0 simple map operator !