无法使用 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。
我有一个具有这种结构的 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。