2

这个 XPath 表达式:

for $n in 1 to 5 return $n

退货

1 2 3 4 5

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

4

2 回答 2

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)

应该在任何语言环境中工作。

于 2013-04-12T16:50:45.543 回答
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简单映射运算符!

于 2013-04-14T18:04:01.557 回答