【问题标题】:How to fetch distinct nodes in XQuery?如何在 XQuery 中获取不同的节点?
【发布时间】:2013-05-11 19:20:37
【问题描述】:

将函数distinct-values() 应用于节点序列时,它返回值序列而不是节点序列。

请有人向我解释一下 XQuery 数据模型的哪个特性使得直接在节点序列上消除重复值变得困难?

另外,如何将这个值序列转回节点序列?

我查看了我的 XML/XQuery 笔记并搜索了互联网,但没有找到明确的信息。

【问题讨论】:

    标签: xml xquery


    【解决方案1】:

    在 XQuery 中,每个节点都是不同的(它有一个内部的唯一节点 ID)。


    如果要比较节点,则必须深入比较它们的值。对此没有预定义的函数,但由于这是一个常见问题,FunctX 包含一个 functx:distinct-deep()。它依赖于functx:is-node-in-sequence-deep-equal(),所以你也需要它。

    declare namespace functx = "http://www.functx.com";
    declare function functx:distinct-deep 
      ( $nodes as node()* )  as node()* {
    
        for $seq in (1 to count($nodes))
        return $nodes[$seq][not(functx:is-node-in-sequence-deep-equal(
                              .,$nodes[position() < $seq]))]
     } ;
    declare function functx:is-node-in-sequence-deep-equal 
      ( $node as node()? ,
        $seq as node()* )  as xs:boolean {
    
       some $nodeInSeq in $seq satisfies deep-equal($nodeInSeq,$node)
     } ;
    

    您也可以import the whole FunctX module,但这会大大减慢执行速度,具体取决于您的 XQuery 解释器。


    如果您不想坚持使用 FunctX,则需要搜索所有不同的值,并为每个找到第一个元素(因此没有任何前面的元素)并将 data() 与不同的值进行比较。

    for $value in distinct-values(//data())
    return //*[data() = $value][every $preceding in preceding::node() satisfies name() != $preceding/name()]
    

    最后,这与上面的 FunctX 函数的作用相同。您可以对某些部分使用其他构造,但不能省略任何这些步骤。

    【讨论】:

    • 嗨,仁!感谢你的及时回复。只是为了确认:无论如何,每个节点都是不同的,因此应用函数 distinct-value 是有问题的。我需要比较节点以查看它们是否唯一,即不同,但在 XQuery 中没有预定义的工具可以执行此操作。请问您能否更清楚地了解如何将一系列值转换回一系列节点?谢谢M
    • 请告诉我们您的真实问题。我认为您必须解决的问题不是获得不同的节点,而是需要这样做。提供一些输入和预期输出可以更容易地理解您的问题。请将其编辑到您的问题中。也许还可以阅读how to provide a SSCCE。您越具体,就越有可能更快地获得所需的答案。
    • 你好,詹斯!我真正的问题如下:首先,将函数 distinct-values 应用于节点序列时,它返回值序列而不是节点序列。简要说明 XQuery 数据模型的哪个特性使得直接在节点序列上消除重复值变得困难。其次:如何将这个值序列转换回节点序列?谢谢
    • 您想通过“将这个值序列转回节点序列”来实现吗?对此没有通用的解决方案,您必须要么展示您真正想要实现的目标,要么使用我上面提供的功能(应该可以满足您的需求)。
    • 您得到的答案不明确,因为您的问题仍然存在。 您并未向我们提供所有相关信息,因此我们无法提供更好的答案。例如,请说明您是否正在寻找考试题目并向我们提供确切的问题。通常人们会寻找“真正问题”的答案,然后我们会提出合理的答案。如果你真的需要从值返回,你需要再次扫描所有元素并比较里面的数据。我在答案中添加了一个示例。
    猜你喜欢
    • 2012-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 2015-07-20
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多