如何使用XQuery基于子节点的值获取父节点

时间:2013-11-19 02:11:46

标签: xml xslt xpath xquery xquery-3.0

<?xml version="1.0" encoding="utf-8"?>
<transaction>
    <itemset id="1">
        <item>pen</item>
        <item>notebook</item>
        <item>pencile box</item>
    </itemset>
<itemset id="2">
    <item>pen</item>
    <item>notebook</item>
    <item>pencile box</item>
    <item>ink</item>
</itemset>
<itemset id="3">
    <item>ink</item>
    <item>milk</item>
</itemset>
<itemset id="4">
    <item>pen</item>
    <item>notebook</item>
    <item>pencile box</item>
    <item>ink</item>
    <item>milk</item>
    <item>paper</item>
</itemset>
<itemset id="5">
    <item>pen</item>
    <item>ink</item>
    <item>notebook</item>
</itemset>
</transaction>

假设我有一个不同的项目列表。我想从项目集中搜索每个项目。如果项目集具有该项目,那么我将返回包含所有项目的项目集。例如,我有一个明确的项目列表(牛奶,纸张(这不是固定的---动态列表))。 Milk位于itemset-3和itemset-4中,因此我将itemset-3和itemset-4添加到新的XML列表中,然后paper仅在itemset 4中。但是itemset-4已经在列表中,所以不需要再次添加itemset 4。我的问题是如何根据每个项目使用 XQuery 获取项目集,并且项目集仅在我的新列表中添加一次。我正在使用BaseX来运行 XQuery 命令。

预期输出看起来像是

    <?xml version="1.0" encoding="utf-8"?>
<transaction>
<itemset id="3">
    <item>ink</item>
    <item>milk</item>
</itemset>
<itemset id="4">
    <item>pen</item>
    <item>notebook</item>
    <item>pencile box</item>
    <item>ink</item>
    <item>milk</item>
    <item>paper</item>
</itemset>
</transaction>

我试过的代码:

let $src:= doc('XML/test_my.xml')/transaction
let $allitems := $src/itemset/item
let $C:=distinct-values($allitems)
for $value in $C
    let $def:=$src/itemset[item=$value]
    return $def

但是它会为两个或更多不同的项重复返回itemset。如何停止打印现有项目集?请帮帮我......

2 个答案:

答案 0 :(得分:2)

代码中的错误是您分别搜索每个(不同的)值。正如Phil建议的那样,您应该在一个XPath中对所有值进行组合搜索。如果您放弃for行,并将let $def替换为搜索所有值的表达式,那么您就会在那里。类似的东西:

let $allitems := $src/itemset/item
let $C:=distinct-values($allitems)
let $def:=$src/itemset[item=$C]
return $def

您可以在此处用任何值序列替换$ C,例如:

let $C := ('milk', 'paper')

=运算符能够比较序列和节点集,有效地进行交叉。如果相交不为空,则返回true。

HTH!

答案 1 :(得分:0)

像这样的东西

/transaction/itemset[item='milk' or item='paper']

在这里演示 - http://www.xpathtester.com/obj/01c525c6-14ae-427b-b6c6-26f8e1ef17a7