XQuery 中的 Marklogic 整理序列

Marklogic collate sequence in XQuery

有没有办法修改序列中的元素,以便只返回项目的整理版本?

let $currencies := ('dollar', 'Dollar', 'dollar ')
return fn:collated-only($currencies, "http://marklogic.com/collation/en/S1/T00BB/AS")

=> ('dollar', 'dollar', 'dollar')

这是预期的输出吗?没有 fn:collated-only 函数,所以我假设你问的是如何编写这样的函数或者是否有这样的函数。

问题是,在归类比较中没有从一个字符串到另一个字符串的映射,只有一个比较算法 (the Unicode Collation Algorithm),所以确实没有规范的字符串到 return 给你,因此没有 API 这样做。

退一步说,你真正想解决的问题是什么?根据该排序规则,"dollar" 和 "Dollar" 是等价的,通过使用它你声明你不关心你使用哪种形式,所以你可以使用任何一种。

存储在范围索引(为构面提供数据)中的值实际上是遇到的第一个与其他值比较相等的值。 (因为,排序规则说你不在乎...)

你可以通过电话走很远的路 fn:replace(fn:lower-case(xdmp:diacritic-less(fn:normalize-unicode($str,"NFKC"))),"\p{P}","")

这不会完全相同,因为它会折叠一些东西并折叠其他东西,但它可能对您的目的有好处。

如果这些值在 XML 个元素中并且您有一个使用 http://marklogic.com/collation/en/S1/T00BB/AS 的范围索引,您可以这样做:

let $ref := cts:element-reference(xs:QName("currency"), "collation=http://marklogic.com/collation/en/S1/T00BB/AS")
for $curr in cts:values($ref, (), "frequency-order")
return $curr || ": " || cts:frequency($curr)

这将产生如下结果:

"dollar: 15",
"euro: 12"

...等等。整理将忽略样本输入之间的差异。这些结果可以根据需要进行格式化。那是你想要做的吗?