2015-05-12 46 views
0

我已经得到了与此结构的XML文件:无法遍历的元素和XML文件使用XQuery

<profiles> 
    <profile profile="SuperAdministrator" name="admin"/> 
    <profile project="TesteHandSpy" profile="Researcher" name="john"/> 
    <profile project="DunnProject,DAAR1_op,Sara" profile="Researcher" name="juliete"/> 
</profiles> 

而且我想一定值来选择轮廓元素的项目价值属性名称。我开始尝试列出所有配置文件元素,并且遇到问题。我可以找到该文件,但后来我使用了在几处找到的命令,并返回了零结果。这里是我测试的xquery:

let $param := "juliete" 
let $profiles:= doc("/db/db_project/profiles.xml")/profiles/profile 

for $profile in $profiles 
return $profile 

你能帮助我吗?我想当这个开始工作时,我所要做的就是将[@ name = $ param]添加到查询中。

+0

哪个处理器?你确定路径是正确的吗?您正在使用的xquery是正确的列出所有配置文件。 –

+0

@EwoutGraswinckel如果我删除“/ profiles/profile”它显示我的文件的内容,所以我想这意味着我的路径是正确的。我也试图把“/ /个人资料”,它没有工作。 – patricia

+0

@EwoutGraswinckel我试图用xquery 3.0的eXist-db – patricia

回答

1

这里不需要FLOWR表达式。一个简单的路径会做:

doc("/db/db_project/profiles.xml")/profiles/profile[@name eq $param]

,这回没有什么能有几个原因的事实。最明显的是1)URI不正确(尝试使用相同的URI调用doc()以确保它返回文档)或2)命名空间问题(您可以尝试*:profiles/*:profile来验证情况并非如此)。

使用doc()的问题在于它不能在其他人的机器上重现。如果您将文档的内容放在变量中,则该查询将是自包含的,我们将能够提供更好的帮助。

更新

您的评论后,现在看来,这是一个命名空间的问题。所以你上面引用的XML输入并不完全正确。它缺乏一些命名空间,像:

<profiles xmlns="http://example.org/project"> 
    ... 
</profiles> 

/profiles/profile的路径返回元素profile,元素profiles的孩子,都没有命名空间。要访问那些在特定的命名空间,你必须绑定一个前缀,该命名空间URI,然后再使用前缀每个元素的名称:

declare namespace p = "http://example.org/project"; 
doc("/db/db_project/profiles.xml")/p:profiles/p:profile[@name eq $param] 

你必须明白的是,在查询中使用的前缀(中这种情况下p)和XML中使用的一个(在这种情况下没有前缀,因为URI被绑定为默认名称空间)不必匹配。它们都绑定的URI必须匹配。

+0

谢谢你,*:profiles/*:profile xquery正在工作。你能向我解释为什么/简介/简介不起作用吗? – patricia

+1

当然,我已经在上面更新了我的答案。 –

+0

谢谢你的解释:) – patricia