我有以下xml:
<form>
<bibl>
<biblScope>1</biblScope>
<biblScope>a</biblScope>
</bibl>
<bibl>
<biblScope>2</biblScope>
<biblScope>b</biblScope>
</bibl>
<bibl>
<biblScope>38</biblScope>
<biblScope>c</biblScope>
</bibl>
</form>
使用此XQuery
for $bibl in form/bibl
return
<div>
{
for $biblScope in $bibl/biblScope/text()
return
$biblScope
}
{if ($bibl[position()] ne $bibl[last()]) then ',' else '@'}
</div>
<biblScope>
内容一个接一个地打印出来。在每个bibl
元素之后,我想添加一个分隔符(逗号/&#34;,&#34;),除了最后一个,但是使用上面的代码,我得到的只是
<div>
1a
@
</div>
<div>
2b
@
</div>
<div>
38c
@
</div>
这绝对是错误的,因为我想拥有的是
<div>1a,</div>
<div>2b,</div>
<div>38c@</div>
(在每个bibl
元素内容后添加一个逗号;最后一个应该跟@
而不是逗号。)
现在尝试了不同的东西,我需要一些帮助。这样做的正确方法是什么?
答案 0 :(得分:4)
首先请注意:
for $biblScope in $bibl/biblScope/text()
return
$biblScope
可以替换为:
$bibl/biblScope/text()
(这种冗长是一个令人惊讶的常见错误。它表明你在程序上思考 - 一次处理一个项目,而不是处理集合。)
然后这个:
<div>
{$bibl/biblScope/text()}
{if ($bibl[position()] ne $bibl[last()]) then ',' else '@'}
</div>
应该替换为:
<div>{string-join($bibl/biblScope, ',')}@</div>
请注意,我还摆脱了/text()
的不必要(并且可以说是不正确)的使用,这是另一个XQuery反模式。
答案 1 :(得分:3)
问题是mabe@ubuntu:~/Desktop $ python test_2.py
2.49 % changes of getting virus on CompB
2.6 % changes of getting virus on CompC
5.07 % changes of getting virus on CompA
1.38 % changes of getting virus on CompBE
1.16 % changes of getting virus on CompBD
1.18 % changes of getting virus on CompCD
1.36 % changes of getting virus on CompCE
和position()
处理当前上下文,而不是由flwor表达式设置的。如果要使用类似的语义,请使用last()
语法获取位置计数器,并将at $position
定义为结果数:
$last
如果您能够使用XQuery 3.0,那么应用程序运营商let $last := count(form/bibl)
for $bibl at $position in form/bibl
return
<div>
{
for $biblScope in $bibl/biblScope/text()
return
$biblScope
}
{if ($position ne $last) then ',' else '@'}
</div>
可能会在这里使用。通过轴步骤和元素构造函数替换不必要的循环,您可以依赖位置谓词,因为上下文设置为!
元素:
<bibl/>