Является ли tokenize($s) таким же, как tokenize($s, ' ')?

https://www.w3.org/TR/xpath-functions/ объясняет версию с одним аргументом 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 ответ

Решение

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

Другие вопросы по тегам