这个 XPath 表达式:
for $n in 1 to 5 return $n
退货
1 2 3 4 5
是否可以用字母字符做类似的事情?
是的:
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)
应该在任何语言环境中工作。
或者,在 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简单映射运算符!
。