You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by mo...@apache.org on 2001/10/08 15:27:38 UTC
cvs commit: xml-xalan/java/src/org/apache/xalan/xsltc/compiler xpath.cup
morten 01/10/08 06:27:38
Modified: java/src/org/apache/xalan/xsltc/compiler xpath.cup
Log:
A radical fix for how the abbreviated descendant iterator is handled by
the XPath parser. The previousl implementation could misplace/ignore
prediates and did not properly handle .//@* style expressions.
PR: bugzilla 3314
Obtained from: n/a
Submitted by: morten@xml.apache.org
Reviewed by: morten@xml.apache.org
Revision Changes Path
1.20 +43 -27 xml-xalan/java/src/org/apache/xalan/xsltc/compiler/xpath.cup
Index: xpath.cup
===================================================================
RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/xsltc/compiler/xpath.cup,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- xpath.cup 2001/10/08 09:50:28 1.19
+++ xpath.cup 2001/10/08 13:27:38 1.20
@@ -1,5 +1,5 @@
/*
- * @(#)$Id: xpath.cup,v 1.19 2001/10/08 09:50:28 morten Exp $
+ * @(#)$Id: xpath.cup,v 1.20 2001/10/08 13:27:38 morten Exp $
*
* Copyright 2000 Sun Microsystems, Inc. All Rights Reserved.
*
@@ -451,36 +451,52 @@
AbbreviatedRelativeLocationPath ::= RelativeLocationPath:rlp DSLASH Step:step
{:
- Step nodeStep;
- final Step temp = (Step)step;
- final int axis = temp.getAxis();
- // THIS CODE IS NOT GOOD - PREDICATES ARE MISPLACED!!!!!
- if ((axis == Axis.CHILD) || (axis == Axis.ATTRIBUTE)) {
- // Expand 'rlp//child::E' into 'rlp/descendant::E'
- nodeStep = new Step(Axis.DESCENDANT,
- temp.getNodeType(),
- temp.getPredicates());
-
- if (rlp instanceof Step && ((Step) rlp).isAbbreviatedDot()) {
- RESULT = nodeStep; // Remove './/' from the beginning
+ final Step right = (Step)step;
+ final int axis = right.getAxis();
+ final int type = right.getNodeType();
+ final Vector predicates = right.getPredicates();
+
+ if ((axis == Axis.CHILD) && (type != NodeTest.ATTRIBUTE)) {
+ // Compress './/child:E' into 'descendant::E' - if possible
+ if (predicates == null) {
+ if (rlp instanceof Step && ((Step)rlp).isAbbreviatedDot()) {
+ right.setAxis(Axis.DESCENDANT);
+ RESULT = right;
+ }
+ else {
+ // Expand 'rlp//child::E' into 'rlp/descendant::E'
+ RelativeLocationPath left = (RelativeLocationPath)rlp;
+ RESULT = new ParentLocationPath(left, right);
+ }
}
- else {
- RESULT = new ParentLocationPath((RelativeLocationPath) rlp,
- nodeStep);
+ else {
+ // Expand './/step' -> 'descendant-or-self::*/step'
+ if (rlp instanceof Step && ((Step)rlp).isAbbreviatedDot()) {
+ Step left = new Step(Axis.DESCENDANTORSELF, -1, null);
+ RESULT = new ParentLocationPath(left, right);
+ }
+ else {
+ // Expand 'rlp//step' -> 'rlp/descendant-or-self::*/step'
+ RelativeLocationPath left = (RelativeLocationPath)rlp;
+ Step mid = new Step(Axis.DESCENDANTORSELF, -1, null);
+ ParentLocationPath ppl = new ParentLocationPath(mid, right);
+ RESULT = new ParentLocationPath(left, ppl);
+ }
}
+ }
+ else if ((axis == Axis.ATTRIBUTE) || (type == NodeTest.ATTRIBUTE)) {
+ // Expand 'rlp//step' -> 'rlp/descendant-or-self::*/step'
+ RelativeLocationPath left = (RelativeLocationPath)rlp;
+ Step middle = new Step(Axis.DESCENDANTORSELF, -1, null);
+ ParentLocationPath ppl = new ParentLocationPath(middle, right);
+ RESULT = new ParentLocationPath(left, ppl);
}
else {
- // Expand 'rlp//step' into 'rlp/descendant-or-self::node()/step'
- nodeStep = new Step(Axis.DESCENDANTORSELF,
- NodeTest.ANODE, null);
- /*
- RESULT = new ParentLocationPath(
- new ParentLocationPath((RelativeLocationPath) rlp,
- nodeStep), step);
- */
- RESULT = new ParentLocationPath((RelativeLocationPath)rlp,
- new ParentLocationPath(nodeStep, step));
-
+ // Expand 'rlp//step' -> 'rlp/descendant-or-self::node()/step'
+ RelativeLocationPath left = (RelativeLocationPath)rlp;
+ Step middle = new Step(Axis.DESCENDANTORSELF, -1, null);
+ ParentLocationPath ppl = new ParentLocationPath(middle, right);
+ RESULT = new ParentLocationPath(left, ppl);
}
:};
---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org