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), ' '))
仅将单个空格用作分隔符,而不是空白边界。
规范中作为单参数版本的定义给出的等效性是否错误?
调用normalize-space()
会将换行符替换为x20空格字符。所以,当count(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个。