tokenize($ s)是否与tokenize($ s,'')相同?

时间:2018-09-18 08:12:45

标签: xslt-3.0 xquery-3.1 xpath-3.1

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

  

此函数的单参数形式将提供的字符串分割为   空白边界。

然后继续定义或解释

  

呼叫fn:tokenize($input)等同于呼叫   fn:tokenize(fn:normalize-space($input), ' '))在第二个   参数是一个空格字符(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)的文字说明有关(“将提供的字符串分割为空白边界”),但似乎fn:tokenize($input)和{{规范中给出的1}}成立了,如果按字面意义传递了空格,则仅将单个空格用作分隔符,而不使用空格边界。

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

1 个答案:

答案 0 :(得分:5)

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个令牌。