XQuery:除了最后一个元素之外,如何在序列之后添加逗号

时间:2016-01-07 17:34:43

标签: xquery xpath-2.0

我有以下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元素内容后添加一个逗号;最后一个应该跟@而不是逗号。)

现在尝试了不同的东西,我需要一些帮助。这样做的正确方法是什么?

2 个答案:

答案 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/>