XQuery-如何选择所有子元素都具有特定内容的所有父元素?

时间:2018-08-23 15:47:10

标签: xml xquery

我具有以下XML结构

<GAMES>
    <GAME>
        <ID>1</ID>
        <NAME>A Game</NAME>
        <ELEMENTS>
            <ELEMENT>
                <SOMEVALUE>true</SOMEVALUE>
            </ELEMENT>
            <ELEMENT>
                <SOMEVALUE>false</SOMEVALUE>
            </ELEMENT>
        </ELEMENTS>
    </GAME>
    <GAME>
        <ID>2</ID>
        <NAME>Another game</NAME>
        <ELEMENTS>
            <ELEMENT>
                <SOMEVALUE>true</SOMEVALUE>
            </ELEMENT>
            <ELEMENT>
                <SOMEVALUE>true</SOMEVALUE>
            </ELEMENT>
        </ELEMENTS>
    </GAME>
</GAMES>

我想选择所有值为SOMEVALUE为真的游戏。因此,在上面的示例中,我想获得:

<GAME>
    <ID>2</ID>
    <NAME>Another game</NAME>
    <ELEMENTS>
        <ELEMENT>
            <SOMEVALUE>true</SOMEVALUE>
        </ELEMENT>
        <ELEMENT>
            <SOMEVALUE>true</SOMEVALUE>
        </ELEMENT>
    </ELEMENTS>
</GAME>

我在此查询中尝试过,但没有成功

let $db := db:open("game")/GAMES
let $games := $db/GAME[data(ELEMENTS/ELEMENT/SOMEVALUE) = 'true']
return $games

有解决方案吗?而且,那里有一个很好的资源,可以使用XQuery进行操作。我发现的所有内容都没有得到充分的记录或没有示例

3 个答案:

答案 0 :(得分:3)

您的口头描述“选择所有具有SOMEVALUE均为真的值的游戏”,根据我的理解,翻译为

/GAMES/GAME[every $value in ELEMENTS/ELEMENT/SOMEVALUE satisfies $value = 'true']

https://xqueryfiddle.liberty-development.net/nbUY4kk

关于文档,请阅读规格:https://www.w3.org/TR/xquery-31/https://www.w3.org/TR/xpath-functions/

答案 1 :(得分:0)

尝试:

let $db := db:open("game")/GAMES
let $games := $db/GAME[ELEMENTS/ELEMENT/SOMEVALUE = 'true']
return $games

您不需要data()函数。

答案 2 :(得分:0)

我不知道您使用的XQuery是什么,但是我希望这些变体之一可以解决问题:

let $games := $db/GAME[data(./ELEMENTS/ELEMENT/SOMEVALUE) = 'true']

let $games := $db/GAME[./ELEMENTS/ELEMENT/SOMEVALUE/string() = 'true']

let $games := $db/GAME[compare(./ELEMENTS/ELEMENT/SOMEVALUE/string(),'true') = 0]

我非常重视XQuery wikibook作为第一次学习XQuery的资源。