- From: Zjnue Brzavi <zjnue.brzavi@googlemail.com>
- Date: Mon, 9 Feb 2015 19:28:44 +0100
- To: Ate Douma <ate@douma.nu>
- Cc: "www-voice@w3.org" <www-voice@w3.org>
- Message-ID: <CABmmmmz7PFJCuJ898hpm4d91yGCP5-8D5yJP0hf2wvs2xHdMTg@mail.gmail.com>
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