Xquery - 仅返回if / then

时间:2016-04-03 05:26:49

标签: xpath xquery

在使用if / then确定我是否首先使用该元素之后,我一直在尝试编写查询来获取不同的属性值。这是我的示例xml和我迄今为止编写的查询:

<donors>
    <donor donor_id="x21" cn_id="x12">
        <homeless>$1201</homeless>
        <conservation>$300</conservation>
        <cancerResearch>$250</cancerResearch>
    </donor>
    <donor donor_id="x23" cn_id="x13">
        <homeless>$121</homeless>
        <conservation>$30</conservation>
        <cancerResearch>$50</cancerResearch>
    </donor>
    <donor donor_id="x24" cn_id="x14">
        <homeless>$1201</homeless>
        <cancerResearch>$250</cancerResearch>
    </donor>
    <donor donor_id="x25" cn_id="x12">
        <homeless>$1201</homeless>
        <conservation>$300</conservation>
        <cancerResearch>$250</cancerResearch>
    </donor>
</donors>

我想首先让所有有孩子的捐赠者得到保护&#34;。我为此完成了以下工作:

<conservationists>
{
for $x in //donor
return
    if(exists($x/conservation))
    then <conservationist cn_id="{$x/@cn_id}/>
    else ()
}
</conservationists>

我尝试将整个事物包装在不同的值中,但这并没有给出任何结果,而且我尝试做的其他任何事情都是为了达到这个效果,我最终得到了一个结束标记。

1 个答案:

答案 0 :(得分:3)

这是一种可能的方式:

<conservationists>
{
    for $x in distinct-values(//donor[conservation]/@cn_id)
    return
        <conservationist cn_id="{$x}"/>
}
</conservationists>

<强> xpathtester demo

表达式distinct-values(//donor[conservation]/@cn_id)会从cn_id元素中返回donor个属性的不同值,这些元素至少包含一个conservation子元素。