2

https://www.w3.org/TR/xpath-functions/#func-tokenize解释了单参数版本tokenize

此函数的单参数形式在空白边界处拆分提供的字符串。

然后继续定义或解释

调用fn:tokenize($input)等效于调用 fn:tokenize(fn:normalize-space($input), ' ')),其中第二个参数是单个空格字符 (x20)

但是,当我尝试count(tokenize('1 2 3')), count(tokenize('1
2
3'))使用 Saxon 或 BaseX 或 XmlPrime 时,我得到了虽然所有三种实现中3 3的假定等效项给了我.count(tokenize('1 2 3', ' ')), count(tokenize('1
2
3', ' '))3 1

因此,所有三种实现似乎都与文本解释所说的有关(“在空白边界处拆分提供的字符串”),但如果从字面上传入一个空格,那么规范中的和给出tokenize($s)的等价似乎并不成立只有单个空格用作分隔符,而不是空白边界。fn:tokenize($input)fn:tokenize(fn:normalize-space($input), ' '))

规范中作为单参数版本的定义给出的等价是错误的吗?

4

1 回答 1

5

调用normalize-space()用 x20 个空格字符替换换行符。所以 whilecount(tokenize('1
2
3', ' '))给出 1,count(tokenize(normalize-space('1
2
3'), ' '))给出 3。

使用更智能的正则表达式可以实现用单个空格替换换行符和制表符,但调用normalize-space()实现的关键是修剪前导和尾随空格。例如tokenize(" red green blue ", "\s+")给出 5 个令牌,但tokenize(" red green blue ")给出 3 个。

于 2018-09-18T17:39:08.620 回答