无法使用xquery迭代on和xml文件上的元素

时间:2015-05-12 15:46:43

标签: xml xquery exist-db

我有一个带有这种结构的xml文件:

<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]。

1 个答案:

答案 0 :(得分: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的子元素,所有这些都在NO命名空间中。要访问特定命名空间中的那些,您必须首先将前缀绑定到该命名空间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必须匹配。