【问题标题】:Marklogic collate sequence in XQueryXQuery 中的 Marklogic 整理序列
【发布时间】:2015-10-01 13:13:00
【问题描述】:

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

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

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

【问题讨论】:

    标签: xquery marklogic


    【解决方案1】:

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

    你可以通过调用获得很长的路要走 fn:replace(fn:lower-case(xdmp:diacritic-less(fn:normalize-unicode($str,"NFKC"))),"\p{P}","")

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

    【讨论】:

    • 谢谢,这将为我提供我正在寻找的结果,但我会很高兴使用相同的排序规则命名空间字符串来确保我选择了相同的值。使用 XQuery 查找货币计数非常棘手。
    【解决方案2】:

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

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

    退一步说,你真正想要解决的问题是什么?根据该排序规则,“dollar”和“Dollar”是等价的,通过使用它,您声明您不在乎使用哪种形式,因此您可以使用任何一种。

    【讨论】:

    • 您好,感谢您的回复。我试图做的是在 xquery 中产生一些输出,然后使用 search:search facets 重现。我使用 fn:distinct-values 然后计算匹配节点。答案不匹配,所以我意识到我在比较错误的东西。我认为如果 fn:distinct 存在,则必须有一些等价物来减少序列中的多样性。
    【解决方案3】:

    如果这些值在 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"
    

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

    【讨论】:

    • 这非常有效,并且基于相同的排序规则,因此风险较小。结合其他答案,我今天学到了一些技巧。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多