【问题标题】:Is tokenize($s) the same as tokenize($s, ' ')?tokenize($s) 和 tokenize($s, ' ') 一样吗?
【发布时间】:2019-02-22 05:09:24
【问题描述】:

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), ' '))规范成立,如果按字面意思传入一个空格,那么只有那个空格用作分隔符,而不是空白边界。

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-25
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多