如何在同一个XQuery中访问祖先节点?
How to access the ancestor node in the same XQuery?
<results>
{
for $p in
(
for $o in doc("mondial-3.0.xml") /mondial/organization
where fn:count($o/members)
order by fn:count($o/members) descending
return <organization>
<name> {$o/@name/string()} </name>
<abbreviation> {$o/@abbrev/string()} </abbreviation>
<num_members> {fn:count($o/members)} </num_members>
<members> {for $m in doc("mondial-3.0.xml") $o/members
return <country> {mondial/country[@id=$m/@country]/@name/string()} </country>} </members>
</organization>
)[position() < 10]
return $p
}
</results>
在这个问题中我无法访问祖先节点,因为我已经存储了一个参数的 ID,现在我想匹配该参数的 ID 并获取参数的名称。
我没有得到任何输出。我不确定我哪里出错了。
XML 文件:-
xml 文件的 link 是 https://raw.githubusercontent.com/kroell/hsrm-mi-2semester-markuplanguage/master/Abgabe2/Aufgabe2/mondial-3.0.xml
您没有定义所需的查询输出,因此很难告诉您为什么您的查询未提供所需的输出;但有几处查询表明它是完全错误的。
首先,$o
始终是单个<mem>
元素,因此fn:count($o)
始终为1,因此在where
和[=14中使用此表达式=] 子句不能产生任何有用的效果。
其次,用于生成 <f>
元素内容的表达式看起来完全错误,因为它不以任何方式依赖于 $o
.
的值
在您发布的 link 中,XML 的根元素是 mondial
而不是 users
,所以我在此使用 mondial
回答。请注意 member of organization 和 country 是 linked by country id,所以你可以按照以下步骤获取每个 member
元素的国家名称:
<f>
{
for $m in $o/members
return <g> {mondial/country[@id=$m/@country]/@name/string()} </g>
}
</f>
这是完整的工作查询。在 http://www.xpathtester.com/xquery 中使用问题中发布的 link 中的 XML 作为输入进行了测试:
<a>
{
for $p in
(
for $o in /mondial/organization
where fn:count($o/members)
order by fn:count($o/members) descending
return <b>
<c> {$o/@name/string()} </c>
<d> {$o/@abbrev/string()} </d>
<e> {fn:count($o/members)} </e>
<f> {for $m in $o/members
return <g> {/mondial/country[@id=$m/@country]/@name/string()} </g>} </f>
</b>
)[position() < 10]
return $p
}
</a>
<results>
{
for $p in
(
for $o in doc("mondial-3.0.xml") /mondial/organization
where fn:count($o/members)
order by fn:count($o/members) descending
return <organization>
<name> {$o/@name/string()} </name>
<abbreviation> {$o/@abbrev/string()} </abbreviation>
<num_members> {fn:count($o/members)} </num_members>
<members> {for $m in doc("mondial-3.0.xml") $o/members
return <country> {mondial/country[@id=$m/@country]/@name/string()} </country>} </members>
</organization>
)[position() < 10]
return $p
}
</results>
在这个问题中我无法访问祖先节点,因为我已经存储了一个参数的 ID,现在我想匹配该参数的 ID 并获取参数的名称。
我没有得到任何输出。我不确定我哪里出错了。
XML 文件:-
xml 文件的 link 是 https://raw.githubusercontent.com/kroell/hsrm-mi-2semester-markuplanguage/master/Abgabe2/Aufgabe2/mondial-3.0.xml
您没有定义所需的查询输出,因此很难告诉您为什么您的查询未提供所需的输出;但有几处查询表明它是完全错误的。
首先,$o
始终是单个<mem>
元素,因此fn:count($o)
始终为1,因此在where
和[=14中使用此表达式=] 子句不能产生任何有用的效果。
其次,用于生成 <f>
元素内容的表达式看起来完全错误,因为它不以任何方式依赖于 $o
.
在您发布的 link 中,XML 的根元素是 mondial
而不是 users
,所以我在此使用 mondial
回答。请注意 member of organization 和 country 是 linked by country id,所以你可以按照以下步骤获取每个 member
元素的国家名称:
<f>
{
for $m in $o/members
return <g> {mondial/country[@id=$m/@country]/@name/string()} </g>
}
</f>
这是完整的工作查询。在 http://www.xpathtester.com/xquery 中使用问题中发布的 link 中的 XML 作为输入进行了测试:
<a>
{
for $p in
(
for $o in /mondial/organization
where fn:count($o/members)
order by fn:count($o/members) descending
return <b>
<c> {$o/@name/string()} </c>
<d> {$o/@abbrev/string()} </d>
<e> {fn:count($o/members)} </e>
<f> {for $m in $o/members
return <g> {/mondial/country[@id=$m/@country]/@name/string()} </g>} </f>
</b>
)[position() < 10]
return $p
}
</a>