- From: Steven Pemberton <steven.pemberton@cwi.nl>
- Date: Wed, 03 Apr 2019 22:26:56 +0200
- To: public-xformsusers@w3.org
So the answer is: 5 4 3 2 1 1 2 3 4 5 and it is the first line that surprised me initially. The instance ends up looking like this: <data xmlns=""> <v>5</v><v>4</v><v>3</v><v>2</v><v>1</v> <list> <v>1</v><v>2</v><v>3</v><v>4</v><v>5</v> </list> </data> The reason is this. In https://www.w3.org/community/xformsusers/wiki/XForms_2.0#The_insert_Element [[[[ The target location is determined for each cloned node: * if the target-sequence is non-empty, then the cloned node will become the sibling of the insert location node: [...] the target location is immediately before or after the insert location node, depending on the position attribute setting or its default; * if the target-sequence is empty, then the cloned node will become a child of the insert location node. The target location is determined by the type of the insert location node: [...] * an element: [...] the target location is before the first child of the insert location node, or the child list of the insert location node if it is empty; ]]]] So if the target-sequence is non-empty, it is inserted depending on @at and @position, and if neither of those are present, *after* the *last* node. If the target-sequence is empty, it is inserted (regardless of @at and @position, which have no effect) *before* the *first* node. So that means repeated inserting * in a non-empty list inserts in insertion order; * in an empty-list inserts in reverse insertion order. It is an edge case I agree, since in the normal use-case the first insert will make the list non-empty, and you won't see the effect. But it is a strange inconsistency. Another example: <insert context="list" ref="n" origin="instance('s')/v[1]"/> <insert context="list" ref="n" origin="instance('s')/v[2]"/> <insert context="list" ref="n" origin="instance('s')/v[3]"/> <insert context="list" ref="n" origin="instance('s')/v[4]"/> <insert context="list" ref="n" origin="instance('s')/v[5]"/> <insert context="list" ref="v" origin="instance('s')/v[1]"/> <insert context="list" ref="v" origin="instance('s')/v[2]"/> <insert context="list" ref="v" origin="instance('s')/v[3]"/> <insert context="list" ref="v" origin="instance('s')/v[4]"/> <insert context="list" ref="v" origin="instance('s')/v[5]"/> would give <list> <v>5</v><v>4</v><v>3</v><v>2</v><v>1</v> <v>1</v><v>2</v><v>3</v><v>4</v><v>5</v> </list> Steven On Wed, 03 Apr 2019 14:24:35 +0200, Steven Pemberton <steven.pemberton@cwi.nl> wrote: > What does this output? (Answer supplied in a following mail: but it > caught me out!). > > <model> > <instance> > <data xmlns=""> > <list/> > </data> > </instance> > <instance id="s"> > <data xmlns=""> > <v>1</v> > <v>2</v> > <v>3</v> > <v>4</v> > <v>5</v> > </data> > </instance> > <action ev:event="xforms-ready"> > <insert ref="list/v" origin="instance('s')/v[1]"/> > <insert ref="list/v" origin="instance('s')/v[2]"/> > <insert ref="list/v" origin="instance('s')/v[3]"/> > <insert ref="list/v" origin="instance('s')/v[4]"/> > <insert ref="list/v" origin="instance('s')/v[5]"/> > <insert context="list" ref="v" origin="instance('s')/v[1]"/> > <insert context="list" ref="v" origin="instance('s')/v[2]"/> > <insert context="list" ref="v" origin="instance('s')/v[3]"/> > <insert context="list" ref="v" origin="instance('s')/v[4]"/> > <insert context="list" ref="v" origin="instance('s')/v[5]"/> > </action> > </model> > <group> > <repeat ref="v" ><output value="."/></repeat> > <repeat ref="list/v"><output value="."/></repeat> > </group> > > Steven
Received on Wednesday, 3 April 2019 20:27:21 UTC