Selectif计数条件

Select if count condition

我正在尝试 select 一个 "station" 项目,如果它有超过 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>

上下文节点

路径开头的斜杠始终表示隐式根查询。翻译成英语,您的查询会翻译成类似(Krankenhaus 表示医院,Station 具有相同的含义,Bett是一张床,belegt表示被占用):

Select all hospital's stations if there are at least four occupied beds (in all hospitals).

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

./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]