- 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