xpath 2.0 - XQuery: How to add a comma after sequence except for the last element -
i have following 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>
using xquery
for $bibl in form/bibl return <div> { $biblscope in $bibl/biblscope/text() return $biblscope } {if ($bibl[position()] ne $bibl[last()]) ',' else '@'} </div>
the <biblscope>
contents printed 1 after another. after each bibl
element, add separator (comma / ",") except last one, code above, is
<div> 1a @ </div> <div> 2b @ </div> <div> 38c @ </div>
and wrong, because have is
<div>1a,</div> <div>2b,</div> <div>38c@</div>
(add comma after every bibl
element content; last 1 supposed followed @
instead of comma.)
having tried different things time now, need help. proper way this?
the problem position()
, last()
work on current context, not set flwor expressions. if want use similar semantics, use at $position
syntax position counter, , define $last
number of results:
let $last := count(form/bibl) $bibl @ $position in form/bibl return <div> { $biblscope in $bibl/biblscope/text() return $biblscope } {if ($position ne $last) ',' else '@'} </div>
if you're able use xquery 3.0, application operator !
might of use here. replacing unnecessary loops axis steps , element constructors in those, can rely on positional predicates, context set to <bibl/>
elements:
form/bibl ! <div> { biblscope/text(), if (position() ne last()) ',' else '@' } </div>
Comments
Post a Comment