XQuery:How要算一个元素为空还是不存在?

XQuery:How to count an element is empty or it does not exist?

我有一个 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>

我要统计没有备注的listing的数量,这意味着元素备注为空或没有 exist.If 一个listing有两个备注,备注必须有 context.In 我的例子,No.1,2,3 listing is count,结果是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)

它 return 1 1 1 0 0.I 尝试添加求和函数但是没有 use.Where 是错误吗?谢谢帮助。

问题是您正在迭代一个可能不存在的元素 (<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)) )