我有一个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.我尝试添加一个求和函数但没有用。哪有错误?谢谢你的帮助。
答案 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)) )