这个XPath表达式:
for $n in 1 to 5 return $n
返回
1 2 3 4 5
是否可以用字母字符做类似的事情?
答案 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 !
。