无法使用 xquery 遍历 xml 文件上的元素

Can't iterate over the elements on and xml file with xquery

我有一个具有这种结构的 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>

并且我想 select 配置文件元素的项目值具有特定的属性名称值。我开始尝试只列出所有配置文件元素,但我遇到了问题。我可以找到该文件,但随后我使用了在多个地方找到的命令,结果 returns 为零。这是我正在测试的 xquery:

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

for $profile in $profiles
return $profile

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

这里不需要 FLOWR 表达式。一个简单的路径就可以:

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

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

使用 doc() 的问题在于它无法在其他人的机器上重现。如果您将文档的内容放入一个变量中,查询将是独立的,我们将能够提供更好的帮助。

更新

根据您的评论,这似乎是一个名称空间问题。因此,您在上面引用的 XML 输入并不完全正确。它缺少一些名称空间,例如:

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

/profiles/profile return 元素 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。