我有一个变量,它有|
分隔值,如下所示。
我需要确保它永远不会有超过 30 个'|'
序列,所以我相信如果我计算 var 中'|'
的出现次数就足够了
class=1111|2222|3333|4444
你能帮忙写xquery
吗?
我是xquery
新手.
如果删除除栏之外的所有字符,然后像let $s := '1111|2222|3333|4444' return string-length(translate($s, translate($s, '|', ''), ''))
那样使用字符串长度,则会得到|
个字符的数量。使用字符串长度和双重翻译来删除除某个字符以外的任何内容是 XPath 1 的老技巧,当然,因为 XQuery 也有replace
您也可以使用 let $s := '1111|2222|3333|4444' return string-length(replace($s, '[^|]+', ''))
.
tokenize()
函数按|
字符拆分值,然后使用 fn:count()
计算序列中的项目数。
请记住,tokenize 函数使用正则表达式模式,因此您需要将|
转义为|
:
let $PSV := "1111|2222|3333|4444"
let $tokens := fn:tokenize($PSV, "|")
let $token-count := fn:count($tokens)
return
if ($token-count > 30) then
fn:error((), "Too many pipe separated values")
else
(: less than thirty values, do stuff with the $tokens :)
()
只是为了很好的衡量,如果你想做任何性能比较,你可以尝试
let $sep := string-to-codepoints('|')
return count(string-to-codepoints($in)[.=$sep])
这在理论上的优势是(至少在撒克逊语中(它不会在内存中构造任何新的字符串或序列。