2016-04-03 53 views
0

我一直在试图编写一个查询来获取不同的属性值后使用if/then来确定我是否会在第一个地方使用该元素。这里是我的例子xml和我迄今为止所写的查询:Xquery - 只返回不同的属性if/then

<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> 

我想先获得所有有孩子“养护”的捐助者。我做的是以下几点:

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

我试图在包装不同的值整件事但只是给了什么,每一个地方一样,我试着做一些我刚刚结束了一个结束这种效果标签。

回答

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)返回来自具有至少一个conservation子元素donor元素cn_id属性的不同的值。

+0

这是行不通的。 我可以问你一个快速跟进吗? 如果我想尝试一种替代方案:那些没有保护的人,我将如何添加[不存在(保存))] – user3324536

+0

是的,您可以修改谓词。 '捐献者[不(养护)]'也适用于我...... – har07