Вот версия, которая работает:
<xf:action ev:event="DOMActivate">
<xf:setvalue bind="idx" value="1"/>
<xf:action while="xs:integer(xxforms:bind('idx')) le count(instance('main')/item)">
<xf:insert context="instance('main')/item[xs:integer(xxforms:bind('idx'))]" nodeset="name" position="after"
origin="instance('temp')/value" if="not(exists(value))"/>
<xf:setvalue bind="idx" value=". + 1"/>
</xf:action>
</xf:action>
Проблема в том, что xxforms:bind('idx')
возвращает нетипизированное значение, даже если вы указали xsd:integer
.В настоящее время XForms не указывает, что аннотации типов на связках должны приводить к вводу типизированного значения (см. Эти примечания к аннотации типа ).Это означает, что в этом случае значение предиката не является числом (XPath имеет как логические, так и числовые предикаты, и это часто приводит к путанице).Чтобы сделать его числовым предикатом, необходимо преобразовать его в число.
Здесь я использую xs:integer
, поскольку number
является своего рода устаревшей функцией XPath 1, и она возвращает xs:double
, тогда какcount()
функция возвращает xs:integer
).
Существует гораздо более простое решение, когда xxforms:iterate
:
<xf:action ev:event="DOMActivate" xxforms:iterate="item">
<xf:insert if="not(exists(value))"
context="."
nodeset="name"
origin="instance('temp')/value"/>
</xf:action>
iterate
в настоящее время является расширением, но XForms 2добавлю его.