Ming Chen wrote:
Hi Experts,
Recently a colleague and I have disagreed on the parsing process of the
E1/E2[E3], where E3 has a numeric type. Here is the example XML file:
<?xml version="1.0" encoding="UTF-8"?>
<xml>
<table>
<rec id="1">
<para type="error" position="11"/>
<para type="warning" position="12"/>
<para type="warning" position="13"/>
</rec>
<rec id="2">
<para type="warning" position="21"/>
<para type="warning" position="22"/>
<para type="warning" position="23"/>
</rec>
<rec id="3">
<para type="info" position="31"/>
<para type="warning" position="32"/>
<para type="warning" position="33"/>
</rec>
</table>
</xml>
For XPath expression "//rec/para[1]", xmllint.exe outputs:
<para type="error" position="11"/><para type="warning"
position="21"/><para type="info" position="31"/>
While my colleague said that the output should be: <para type="error"
position="11"/>
Your colleague is is interpreting the xpath expression as
( //rec/para ) [1]
rather than
//rec / (para[1])
See section 2.1 of the XPath (1.0) spec; The predicate,
in this case [1], is part of the "step".
So //rec selects a set of <rec> nodes, then for each, the
next step "para[1]" is applied and the union is formed.
Not that the predicate [1] is applied to the union.
...
So, what's the nice distinction between E1/E2[E3] and E1[E2][E3].
The first xpath has 2 steps, where the 2nd step has one predicate.
The second xpath has 1 step which has 2 predicates.
When there are multiple predicates, they are applied
left to right as if they were successive filters.
_______________________________________________
xml mailing list, project page http://xmlsoft.org/
xml@gnome.org
http://mail.gnome.org/mailman/listinfo/xml