XQuery:如何计算元素是空的还是不存在?

时间:2015-05-13 18:12:18

标签: count xquery

我有一个XML文件,其中包含具有以下结构的元素:

<root>
    <listing>
        <seller_info name="1"/>
        <auction_info>
            <notes></notes> 
        </auction_info>
    </listing>
    <listing>
        <seller_info name="2"/>
        <auction_info>
            <notes></notes> 
        </auction_info>
    </listing>
    <listing>
        <seller_info name="3"/>
        <auction_info>
        </auction_info>
    </listing>
    <listing>
        <seller_info name="4"/>
        <auction_info>
            <notes>ABC</notes> 
        </auction_info>
    </listing>
    <listing>
        <seller_info name="5"/>
        <auction_info>
            <notes>ABC</notes>
            <notes>DEF</notes>
        </auction_info>
    </listing>

我必须计算没有注释的列表数量,这意味着元素注释为空或者它不存在。如果一个列表有两个注释,则注释必须有上下文。在我的例子中,No.1,2 ,3列表是计数,结果是3.I编写如下代码:

for $x in //listing
for $y in $x/auction_info/notes
where count($y)=0 or (count($y)=1 and string-length($y)=0)
return 
count($y//..//../seller_info)

它返回1 1 1 0 0.我尝试添加一个求和函数但没有用。哪有错误?谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

问题在于您正在迭代可能不存在的元素(<notes/>)。

相反,继续迭代您的商家信息,并测试每个商家信息是否包含注释:

fn:sum(
  for $x in //listing
  return
    if (fn:empty($x/auction_info/notes))
    then 1
    else 0)

您可以通过将fn:empty()的布尔结果转换为xs:integer来进一步简化:

fn:sum(
  for $x in //listing
  return xs:integer(fn:empty($x/auction_info/notes)))

甚至删除循环:

fn:sum( //listing/xs:integer(fn:empty(./auction_info/notes)) )