无法在xml文档中找到一对相同的喜欢

时间:2014-03-29 18:56:20

标签: xml xquery

<person name = "fred"/>
<person name ="sue"/>
<person name = "jill" />
<person name = "khan"/>
<cheese name ="camembert"/>
<cheese name="roquefort"/>
<liking person="fred" cheese="camembert"/>
<liking person="fred" cheese="roquefort"/>
<liking person ="sue" cheese ="roquefort"/>
<liking person ="jill" cheese = "camembert" />
<liking person ="khan" cheese = "camembert"/>

我使用FLOWR在上面的xml文档中找到了一对喜欢相同奶酪的人做了很多努力。 但是我无法制作逻辑可以帮助我制作一个逻辑来找到喜欢相同奶酪的配对的人,配对不应该重复。

1 个答案:

答案 0 :(得分:2)

再次只是一个草图,因为它有编程任务的(俗气)气味:

  • 你想找到奶酪类型的配对,所以要经过不同种类的奶酪。
  • 对于每种奶酪,找一个喜欢它的人。
  • 对于每个人,找一个也喜欢它的人。

通过仅查找以下人员,您将防止重复。


更新:发布试用后:

for $x in doc("cheese.xml")/cheeseEaters/cheese
for $y in doc("cheese.xml")/cheeseEaters/liking[@cheese = $x/@name]
for $z in $y[@cheese = $y/@cheese]
return $z/@person

正如我认为足够接近,这就是我在做的事情:

for $cheese in //cheese/@name
for $person1 in //liking[@cheese=$cheese]
for $person2 in $person1/following-sibling::liking[@cheese=$cheese]
return element pair {
  $person1/@person/data(),
  $person2/@person/data()
}

需要进行少量修改才能从您获得数据的地方加载数据,但这对您来说很容易。对您的代码的一些评论:

  • 始终使用描述性变量名称。 $x$y下次阅读代码时会让您感到困惑,而其他所有人都会看到它。
  • 在奶酪种类上循环播放&#34;首先&#34;喜欢他们的人似乎是对的。
  • 第三个for循环需要再次搜索整个数据集,你只需循环遍历第二个循环的单个项目。并确保使用following-sibling
  • 最后,你需要返回两个名字。