<?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。如何停止打印现有项目集?请帮帮我......
答案 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