请考虑以下XML -
<div id="test">
<p> Text sihdfaif</p>
<p />
<p> Text sihdfaif</p>
<p />
<p> Text sihdfaif</p>
<p> Text sihdfaif</p>
<p> Text sihdfaif</p>
</div>
现在,我想获得其中包含一些文本的p元素的数量..在这种情况下,该值= 5(有2个'p'元素为空)
这是我想出的XQuery -
let $claims_main := $doc//div[@id="test"]
let $claims := $doc//div[@id="test"]/p
let $n := count($claims)
where $claims_main/p != ''
return $n
然而,我从上面得到的结果是7,即包括空的'p'元素。
我想到的另一种方法是在所有'p'元素上使用for循环,但在这种情况下如何检索循环元素的总数?如果我在这种情况下使用计数,那么我只需得到[1,1,1,1,1] - 即。每个p元素的计数(因为在for循环中,计数将是每个'p'元素,而不是div本身)...
答案 0 :(得分:8)
由于问题专门针对其中包含某些文字的“p
元素”,以下是如何获取精确此类p
元素的数量:
count(/*/div/p[string(.)])
这将生成具有非空字符串值的所有p
元素的数量,这些元素是div
的子元素,它是XML文档顶部元素的子元素。
此外,如果“非空”也表示只有非空白字符串值:
count(/*/div/p[normalize-space(.)])
答案 1 :(得分:1)
试试这个:
count($doc//div[@id='test']/p[node()])
第二个谓词[node()]
仅选择包含子节点的元素,它等同于[./node()]
。