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