如何在同一个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 organizationcountry 是 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>