Xml 如何在XQuery中获取不同的节点?

Xml 如何在XQuery中获取不同的节点?,xml,xquery,Xml,Xquery,将函数distinct-values()应用于节点序列时,它会返回一个值序列,而不是节点序列 请有人向我解释一下XQuery数据模型的哪个特性使得直接在一系列节点上消除重复值变得困难 此外,如何将此值序列转换回节点序列 我浏览了我的XML/XQuery笔记,搜索了internet,没有找到明确的信息。在XQuery中,每个节点都是不同的(它有一个内部的、唯一的节点ID) 如果要比较节点,则必须深入比较它们的值。没有为此预定义的函数,但由于这是一个常见问题,因此包含一个。它依赖于,所以你也需要它

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

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

此外,如何将此值序列转换回节点序列


我浏览了我的XML/XQuery笔记,搜索了internet,没有找到明确的信息。

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


如果要比较节点,则必须深入比较它们的值。没有为此预定义的函数,但由于这是一个常见问题,因此包含一个。它依赖于,所以你也需要它

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)
 } ;

最后,这与上面的FunctX函数相同。您可以对某些零件使用其他构造,但不能忽略这些步骤。

Hi Jen!谢谢你的及时回复。只需确认:每个节点无论如何都是distict的,因此应用函数distinct值是有问题的。我需要比较节点,看看它们是唯一的还是不唯一的,即不同的,但是在XQuery中没有预定义的工具来完成这项工作。请您更清楚地说明如何将一系列值转换回一系列节点?谢谢,请告诉我们你真正的问题。我不认为您必须解决的问题是获得不同的节点,但需要这样做。提供一些输入和预期的输出可以使理解您的问题更加容易。请把它编辑成你的问题。也许你也读过。你越具体,就越有可能更快地得到你想要的答案。嗨,詹斯!我真正的问题如下:首先,当将函数distinct values应用于一个节点序列时,它返回一个值序列,而不是一个节点序列。简要说明XQuery数据模型的哪个特性使得直接在一系列节点上消除重复值变得困难。第二:如何将这个值序列转换回节点序列?ThanksWant您想通过“将此值序列转换回节点序列”来实现吗?对于这一点,没有通用的解决方案,您必须展示您真正想要实现的功能,或者使用我上面给出的功能(这些功能应该满足您的需要)。您得到的答案不具体,因为您的问题仍然存在。您没有向我们提供所有相关信息,因此我们无法提供更好的答案。例如,请说明您是否正在寻找考试问题,并给出确切的问题。通常人们都在寻找一个“真正问题”的答案,然后我们会提出合理的答案。如果确实需要从值返回,则需要再次扫描所有元素并比较其中的数据。我在回答中加了一个例子。
for $value in distinct-values(//data())
return //*[data() = $value][every $preceding in preceding::node() satisfies name() != $preceding/name()]