【问题标题】:Select distinct-values according to child node in XQuery在 XQuery 中根据子节点选择 distinct-values
【发布时间】:2011-07-14 02:28:23
【问题描述】:

假设我有以下 XML:

<info>
    <channel>
        <A>
          <X>
            <title>title1</title>
          </X>
          <Y value="20"/>
        </A>
    </channel>
    <channel>
        <A>
          <X>
            <title>title1</title>
          </X>
          <Y value="20"/>
        </A>
        <A>
          <X>
            <title>title2</title>
          </X>
          <Y value="20"/>
        </A>
    </channel>
</info>

以及以下 XQuery

{
for $A in doc('test.xml')//A
let $TITLE := $A/X/title
where string($A/Y/value) > 20
return
  string($TITLE)
}

这当然是输出:

title1
title1
title2

如何使用distinct-values 来删除重复项?我想知道,因为for 基本上每次迭代只给我一个项目,我不能在$A 上调用distinct-values。或者有没有其他方法可以去除重复输出?

问题是我需要引用另一个节点,所以基本上调用distinct-values(doc...) 不起作用,因为它不返回节点。

【问题讨论】:

    标签: duplicates unique xquery


    【解决方案1】:

    更新

    要过滤重复的节点,请使用来自this answer 的xpath 的变体:

    //A[index-of(//A/X/title, X/title)[1]]
    

    这会给你所有的As 和不同的titles。

    您可以扩展此 xpath 表达式以过滤 Y - 不需要 XQuery FLWOR

    更新结束

    distinct-values 应用于要迭代的xpath 表达式:

    for $title in distinct-values(doc('test.xml')//A/X/@title)
    return string($title)
    

    或者只是

    distinct-values(doc('test.xml')//A/X/@title)
    

    【讨论】:

    • 它并没有真正起作用。它选择了一些节点,但我不知道是哪些节点。没有重复,但有些完全丢失。我再次更新了我的问题。
    • 好吧,好像A元素不是根的时候不行!
    • 搞清楚了。您可能想要更新您的答案以反映这些更改,但最终它首先要遍历 channel 元素,然后是您的行的变体:for $A in $CHANNEL/A[index-of(//$CHANNEL/A/X/title, X/title)[1]]
    猜你喜欢
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多