tags:

views:

184

answers:

2

I have an XForm survey. I'd like to keep the questions in a separate xf:instance of the same model from the xf:instance that collects the answers. In one instance, a group containing 10 questions. In a second instance, a group to hold the 10 answers. The second instance will be submitted. So, this is similiar to a join between two lists.

I've tried using logic like the following:

<xf:output ref="instance('questions')/question[position()]/@text"></xf:output>

but that position() is always returning 1, because the context is of the questions xf:instance. Using the index('current-repeater') updates all 10 displayed questions to be the question at the index of the most recently focused repeat iteration.

Is there a way to use a temporary variable in the xpath to accomplish this? I've tried various uses of $variables and even:

<xf:output ref="instance('questions')/question[position() = (count(current()/preceding-sibling::*) + 1)]/@text"></xf:output>

Thanks,

Jason

A: 

Well, it turns out this is currently not supported:

Axes such as "preceding-sibling::" are not yet supported by the XPath analyzer of XSLTForms, which is written with XSLT 1.0.

Instead, do something along these lines:

<xf:instance id="positions">
  <data xmlns="">
    <position />
  </data
</xf:instance>

...

<xf:setvalue ref="instance('positions')/position">1</xf:setvalue>
<xf:setvalue ref="instance('positions')/position" value="count(instance('main')/path/to/things/thing)-1" />
etc.

Then to use them:

<xf:input ref="path/to/things/thing[instance('positions')/position]"> ...

From [email protected]

uosɐſ
+1  A: 

Isn't the solution also:

<xf:output value="instance('questions')/question[current()/position()]/@text"></xf:output>

current() function returns context node, see http://www.w3.org/TR/xforms11/#fn-current.

Tambet