Является ли 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.