使用 xquery 计算元素中字符的出现次数



我有一个变量,它有|分隔值,如下所示。

我需要确保它永远不会有超过 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])

这在理论上的优势是(至少在撒克逊语中(它不会在内存中构造任何新的字符串或序列。

最新更新