1
<?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 列表中,然后纸只在 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

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

4

2 回答 2

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。

于 2013-11-19T08:36:41.550 回答
0

像这样的东西

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

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

于 2013-11-19T02:21:14.993 回答