选择是否计数条件

时间:2015-11-28 16:32:54

标签: xml xquery

我正在尝试选择“站”项,如果它有超过4个子元素“Bett”且属性“Belegt”设置为“false”。子元素应该计算在内。

./Krankenhaus/Station[count(//Bett[@Belegt='true'])>4]

这导致返回所有电台。哪个不正确

这是我正在使用的XML。

<Krankenhaus>
    <Station S_ID="1" Leitung="3">
        <Name>Notaufnahme</Name>
        <Standort>vorort</Standort>
        <Telefonnummer>+43 732 93353555582</Telefonnummer>
        <Leitbild>Schnellstmögliche Versorgung</Leitbild>
    </Station>
    <Station S_ID="2" Leitung="4">
        <Name>Rehabilitation</Name>
        <Standort>extern</Standort>
        <Telefonnummer>+43 732 933522246739954</Telefonnummer>
        <Besuchszeit>täglich 9.00-11.00 und 15.00-17.00</Besuchszeit>
        <Leitbild>
            Bestmögliche Rahmenbedingungen zur vollständigen Rehabilitation
        </Leitbild>
        <Beschreibung>Genesungsfreudliche Umgebung</Beschreibung>
        <Patientenzimmer>
            <Zimmer Z_ID="20105">
                <Stockwerk>1</Stockwerk>
                <Kategorie>A</Kategorie>
                <Klasse>2</Klasse>
                <MaxBetten>4</MaxBetten>
                <Betten>
                    <Bett B_ID="201" Belegt="true"/>
                    <Bett B_ID="202" Belegt="false"/>
                    <Bett B_ID="203" Belegt="true"/>
                    <Bett B_ID="204" Belegt="false"/>
                </Betten>
            </Zimmer>
            <Zimmer Z_ID="20106">
                <Stockwerk>1</Stockwerk>
                <Kategorie>C</Kategorie>
                <Klasse>2</Klasse>
                <MaxBetten>5</MaxBetten>
                <Betten>
                    <Bett B_ID="205" Belegt="true"/>
                    <Bett B_ID="206" Belegt="true"/>
                    <Bett B_ID="207" Belegt="true"/>
                </Betten>
            </Zimmer>
            <Zimmer Z_ID="20107">
                <Stockwerk>1</Stockwerk>
                <Kategorie>C</Kategorie>
                <Klasse>2</Klasse>
                <MaxBetten>5</MaxBetten>
                <Ausstattung>Balkon</Ausstattung>
                <Betten>
                    <Bett B_ID="2010" Belegt="true"/>
                    <Bett B_ID="2011" Belegt="true"/>
                    <Bett B_ID="2012" Belegt="true"/>
                    <Bett B_ID="2013" Belegt="false"/>
                </Betten>
            </Zimmer>
        </Patientenzimmer>
    </Station>
</Krankenhaus>

1 个答案:

答案 0 :(得分:1)

上下文节点

路径起点处的斜杠始终表示隐式根查询。翻译成英语,您的查询转换为类似( Krankenhaus 表示医院, Station 具有相同含义, Bett 是一张床, > belegt 意味着被占用):

  

如果至少有四张病床(在所有医院),请选择所有医院的病房。

相反,在当前上下文.开始搜索,可以明确地完成:

./Krankenhaus/Station[count(./Patientenzimmer/Zimmer/Betten/Bett[@Belegt='true'])>4]

或隐式(请参阅引入子路径的缺失./):

./Krankenhaus/Station[count(Patientenzimmer/Zimmer/Betten/Bett[@Belegt='true'])>4]

当然,您也可以使用我在上面的示例中替换的descendant-or-self//来解释隐式上下文。如果你想坚持切割短路到床的路径,做

./Krankenhaus/Station[count(.//Bett[@Belegt='true'])>4]

上下文和根节点

最后,当您在根节点开始搜索时,我会在查询开头删除前导上下文节点.。通过不把它放在那里(技术上完全没问题,因为默认上下文根节点),你可以更简洁地了解你真正想做的事情:

/Krankenhaus/Station[count(.//Bett[@Belegt='true'])>4]