Re: [SCXML] Incorrect XPath expressions in IR tests 153 & 155

Hi Ate,


>   <datamodel>
>     <data id="Var1" expr="0"/>
>     <data id="Var2"/>
>     <data id="Var3">
>       <node xmlns="">1</node><node xmlns="">2</node><node xmlns="">3</node>
>     </data>
>     <data id="Var4" expr="1"/>
>   </datamodel>
>

[..]


> The "Var2/text()" xpath expressions in the if condition check and the
> assignment value expression above are not valid/usable in this context.
>
> The foreach element will assign each of the Var3 <node>x</node> children
> to the Var2 variable, and the Var2 variable (its data node) thus will
> contains no (direct) text node children, only a (single) "node" child.
>
> To access the actual text value of that "node" child, the expression must
> be: "$Var2/*/text()" or if desired "$Var2/node[1]/text()".
>

This is something I've implemented also, and on this rare occasion I have
to disagree with the suggestion.

Let's take this SO post as context:
http://stackoverflow.com/questions/11744465/xpath-difference-between-node-and-text

Now back to the example you've stated.
Var3 evaluates to an XMLList, which has this simplified structure:

element node (name="node")
    text node (value="1")
element node (name="node")
    text node (value="2")
element node (name="node")
    text node (value="3")

Now, in the foreach structure, as we iterate through this list, we assign a
reference to the next element node to Var2.
In turn, $Var2/text() evaluates to 1, 2 and 3 as we expect.

My guess is that your implementation creates a new XML instance when
assigning values to Var2, giving it values such as:

root node
    element node (name="node")
        text node (value="1")

root node
    element node (name="node")
        text node (value="2")

and so on, thereby requiring the extra axis specifier as you suggested:
$Var2/*/text()   OR  $Var2/node[1]/text()

However, as we are dealing with a complex type, I believe it is wrong to
create new instances and that we should use references to the existing
nodes, making the tests valid as they are currently specified.

In my implementation, I have a normalized foreach routine for the different
datamodels:
https://github.com/zjnue/hscxml/blob/master/src/hsm/scxml/Interp.hx#L935-L972

This works well for the tests mentioned, when I feed it with an array
containing references to the different nodes in the XMLList, formed here:
https://github.com/zjnue/hscxml/blob/master/src/hsm/scxml/Model.hx#L354-L366

Do you agree?

Best regards,
Zjnue

Received on Monday, 9 February 2015 18:29:13 UTC