tokenize($s) 和 tokenize($s, ' ') 一样吗?

Is tokenize($s) the same as tokenize($s, ' ')?

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

The one-argument form of this function splits the supplied string at whitespace boundaries.

然后用

继续定义或解释

calling fn:tokenize($input) is equivalent to calling fn:tokenize(fn:normalize-space($input), ' ')) where the second argument is a single space character (x20)

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

所以这三个实现似乎都与 tokenize($s) 文本解释所说的 ("splits the supplied string at whitespace boundaries") 有关,但 fn:tokenize($input) 和 [=12= 似乎并不等价] 规范中给出的内容成立,如果 space 按字面意思传入,则只有单个 space 用作分隔符,而不是白色 space 边界。

规范中作为单参数版本定义的等效项是否错误?

normalize-space() 的调用将换行符替换为 x20 space 个字符。所以 count(tokenize('1
2
3', ' ')) 给出 1,count(tokenize(normalize-space('1
2
3'), ' ')) 给出 3.

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