Search code examples
xpathorbeonxformsxpath-2.0

How to refer to position when using xf:setvalue function with iterate


Considering this code example and this post

...
<xf:action>
<xf:setvalue
            iterate="instance('fr-send-submission-params')/@*"
            ref="."
            value="event(name(context()))"/>
</xf:action>
...

How can refer to current iterated position? Like value="position()"

Can i use this position as variable to xpath expressions? Like ref="/AnotherElement[position()]"


Solution

  • The following works:

    <xf:action iterate="instance('fr-send-submission-params')/@*">
        <xf:var name="p" value="position()"/>
        <xf:setvalue ref="." value="$p"/>
    </xf:action>
    

    I don't think you can get away just with xf:setvalue, because ref changes the evaluation context of the expression to a single item which means that position() returns 1 within value.

    A warning as I see that you iterate on attributes: I don't think that attribute position is guaranteed to be consistent.

    Update:

    The following works if you have elements, but then you need to have knowledge of the items iterated within the xf:setvalue:

    <xf:setvalue
        event="DOMActivate"
        iterate="value"
        ref="."
        value="count(preceding-sibling::value) + 1"/>
    

    So I think that the option with an enclosing action is much clearer.