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 个。
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 callingfn: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 个。