Является ли tokenize ($ s) таким же, как tokenize ($ s, '')? - PullRequest
0 голосов
/ 18 сентября 2018

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), ' ')), заданная в спецификации, сохраняется, еслипробел в буквальном смысле передается только в том случае, если в качестве разделителя используется только один пробел, а не пробельные границы.

Является ли эта эквивалентность, заданная в спецификации, определением единственного аргумента?т версия не так?

1 Ответ

0 голосов
/ 18 сентября 2018

Вызов 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.

...