- Added KindTest interface that allows in particular the representation of element and attribute tests
- Added a "leaver" which is similar to a visitor but send callback after all children of a node were sent
- javadoc...
diff --git a/xpath_rwapi/src2/org/apache/xpath/XPath20Utilities.java b/xpath_rwapi/src2/org/apache/xpath/XPath20Utilities.java
index 4b40278..01b8496 100644
--- a/xpath_rwapi/src2/org/apache/xpath/XPath20Utilities.java
+++ b/xpath_rwapi/src2/org/apache/xpath/XPath20Utilities.java
@@ -152,5 +152,15 @@
}
return result;
}
+
+ /**
+ * Returns true whenever the specified expression is a
+ * <em>singleton sequence</em> (a sequence with only one item).
+ */
+ public static boolean isSingletonSequence(Expr e)
+ {
+ return e != null && e.getExprType() == Expr.SEQUENCE_EXPR
+ && ((OperatorExpr) e).getOperandCount() == 1;
+ }
}
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/CastOrTreatAsExpr.java b/xpath_rwapi/src2/org/apache/xpath/expression/CastOrTreatAsExpr.java
index 008a437..967b61f 100644
--- a/xpath_rwapi/src2/org/apache/xpath/expression/CastOrTreatAsExpr.java
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/CastOrTreatAsExpr.java
@@ -58,9 +58,9 @@
import org.apache.xpath.datamodel.SequenceType;
/**
- * Represents "cast as" and 'treat as' expression.
- * Use the method <code>getExprType()</code> to differentiate treat as and cast as
- * expressions.
+ * Represents <em>cast as</em> and <em>treat as</em> expression.
+ * Use the method {@link #getExprType()} to differentiate
+ * <em>treat as</em> from <em>cast as</em> expressions.
* @see <a href="http://www.w3.org/TR/xpath20/#id-cast">
* XPath 2.0 specification</a>
*/
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/CastableAsExpr.java b/xpath_rwapi/src2/org/apache/xpath/expression/CastableAsExpr.java
index 88c5e1c..2b17b62 100644
--- a/xpath_rwapi/src2/org/apache/xpath/expression/CastableAsExpr.java
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/CastableAsExpr.java
@@ -58,7 +58,7 @@
import org.apache.xpath.datamodel.SequenceType;
/**
- * Represent "castable as" expression.
+ * Represent <em>castable as</em> expressions.
* @see <a href="http://www.w3.org/TR/xpath20/#id-castable">
* XPath 2.0 specification</a>
*/
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/Expr.java b/xpath_rwapi/src2/org/apache/xpath/expression/Expr.java
index 1aaf9c3..ab6dedb 100644
--- a/xpath_rwapi/src2/org/apache/xpath/expression/Expr.java
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/Expr.java
@@ -57,8 +57,8 @@
/**
* Represents a XPath expression.
- * <p>Use {@link #getExprType()} to query the expression type.
- * More information about expression are obtained by casting it
+ * <p>Use {@link #getExprType()} to get the expression type.
+ * Then, more information about expression are obtained by casting it
* to its corresponding java type. Here the XPath expression type to Java type mapping table:
* </p>
* <table cellpadding="2" cellspacing="2" border="1">
@@ -161,7 +161,7 @@
* }
* } else
* {
- * System.out.println(e.getString(true) + " ");
+ * System.out.print(e.getString(true) + " ");
* }
* }
* </pre>
@@ -171,12 +171,13 @@
* </pre>
* <p>XPath expressions are always fully expanded. For example, the expression
* /a//b is expanded to fn:root(self::node())/descendant-or-self::node()/b.
- * The number of steps is 3 (and not 2).
+ * The number of steps is then 3 (and not 2).
* </p>
* <p>
- * An {@link Expr} object may be not a valid XPath expression but only a fragment.
- * For example a {@link StepExpr} expression is a fragment but can't be executed by
- * itself. To be valid, the top level expression must be an expression sequence.
+ * An {@link Expr} object may be not a valid XPath expression but only a fragment (or a part).
+ * For example {@link StepExpr} and {@link NodeTest} expression types are fragments
+ * and therefore can't be executed by themself. To be valid, the top level expression
+ * must be an expression sequence.
* </p>
* @see <a href="http://www.w3.org/TR/2002/WD-xpath20-20020816/#id-expressions">XPath 2.0 Specification</a>
* @author <a href="mailto:villard@us.ibm.com">Lionel Villard</a>
@@ -214,7 +215,7 @@
/**
* The expression is a quantified expression of type some
*/
- static final short SOME_EXPR = 22;
+ static final short SOME_EXPR = 8;
/**
* The expression is a comparison expression type.
@@ -254,11 +255,7 @@
*/
static final short VARIABLE_REF_EXPR = 15;
- /**
- * The expression is a step
- */
- static final short STEP = 17;
-
+
/**
* The expression is an instance of expression
*/
@@ -284,6 +281,17 @@
*/
static final short LET_EXPR = 23;
+ // Expression parts
+
+ /**
+ * The expression part is a step
+ */
+ static final short STEP = 17;
+
+ /**
+ * The expression part is a node test
+ */
+ static final short NODE_TEST = 11;
/**
* Gets the expression type.
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/KindTest.java b/xpath_rwapi/src2/org/apache/xpath/expression/KindTest.java
new file mode 100644
index 0000000..ca01349
--- /dev/null
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/KindTest.java
@@ -0,0 +1,147 @@
+/*
+ * Created on Aug 8, 2003
+ */
+package org.apache.xpath.expression;
+
+import org.apache.xml.QName;
+import org.apache.xpath.XPath20Exception;
+
+/**
+ * Represents <em>KindTest</em>.
+ * <p>The method {@link #getKindTestType()} returns the kind
+ * test type as following:
+ * <ul>
+ * <li><b>{@link #TEXT_TEST}</b> for text()</li>
+ * <li><b>{@link #PROCESSING_INSTRUCTION_TEST}</b> for processing-instruction()</b>.
+ * Use {@link #getPITarget()} to get the target when specified.</li>
+ * <li><b>{@link #COMMENT_TEST}</b> for comment()</li>
+ * <li><b>{@link #ANY_KIND_TEST}</b> for node()</li>
+ * <li><b>{@link #CONTEXT_ITEM_TEST}</b> for '.'</li>
+ * <li><b>{@link #ELEMENT_TEST}</b> for element tests. Use {@link #getKindTestSubtype()} to get which one:
+ * <ul>
+ * <li><b>{@link #WILDCARD}</b> for element(), or element(*), or element(*,*)</b>
+ * <li><b>{@link #NODE_TYPE}</b> for element(N, T)</li>
+ * <li><b>{@link #NODE_TYPE_NILLABLE}</b> for element(N, T nillable)</li>
+ * <li><b>{@link #NODE_WILDCARD}</b> for element(N, *)</li>
+ * <li><b>{@link #WILDCARD_TYPE}</b> for element(*, T)</li>
+ * <li><b>{@link #SCHEMA_PATH}</b> for element(P)</li>
+ * </ul>
+ * </li>
+ * <li><b>{@link #ATTRIBUTE_TEST}</b> for attribute test. Use {@link #getKindTestSubtype()} to get which one:
+ * <ul>
+ * <li><b>{@link #WILDCARD}</b> for attribute(), or attribute(*), or attribute(*,*)</b>
+ * <li><b>{@link #NODE_TYPE}</b> for attribute(@N, T)</li>
+ * <li><b>{@link #NODE}</b> for attribute(@N)</li>
+ * <li><b>{@link #NODE_WILDCARD}</b> for attribute(@N, *)</li>
+ * <li><b>{@link #WILDCARD_TYPE}</b> for attribute(@*, T)</li>
+ * <li><b>{@link #SCHEMA_PATH}</b> for attribute(P)</li>
+ * </ul>
+ * </ul>
+ * @author <a href="mailto:villard@us.ibm.com">Lionel Villard</a>
+ * @version $Id$
+ */
+public interface KindTest extends NodeTest
+{
+
+ /**
+ * Processing instruction test (kind test)
+ */
+ static final short PROCESSING_INSTRUCTION_TEST = 0;
+
+ /**
+ * Comment test (kind test)
+ */
+ static final short COMMENT_TEST = 1;
+
+ /**
+ * Any kind test (except context item test)
+ */
+ static final short ANY_KIND_TEST = 2;
+
+ /**
+ * Text test (kind test)
+ */
+ static final short TEXT_TEST = 3;
+
+ /**
+ * Document test (kind test)
+ */
+ static final short DOCUMENT_TEST = 4;
+
+ /**
+ * Element test (kind test)
+ */
+ static final short ELEMENT_TEST = 5;
+
+ /**
+ * Attribute test (kind test)
+ */
+ static final short ATTRIBUTE_TEST = 6;
+
+ /**
+ * The node test is a context item test (belong to the kind test group)
+ */
+ static final short CONTEXT_ITEM_TEST = 7;
+
+ // Subtypes
+
+ static final short WILDCARD = 0;
+ static final short NODE_TYPE = 1;
+ static final short NODE = 6;
+ static final short NODE_TYPE_NILLABLE = 2;
+ static final short NODE_WILDCARD = 3;
+ static final short WILDCARD_TYPE = 4;
+ static final short SCHEMA_PATH = 5;
+
+ /**
+ * Gets the kind test code.
+ * @return short One of the kind test constant value
+ */
+ short getKindTestType();
+
+ /**
+ * Gets the subtype kind test code.
+ * @return short One of the subkind test constant value
+ */
+ short getKindTestSubtype();
+
+ /**
+ * Gets the local name used to match either an element,
+ * an attribute or a document node.
+ * See class description to see when to use this method.
+ * @return The local name or null
+ * @throws XPath20Exception whenever the kind test type of is not
+ * {@link #ELEMENT_TEST} or {@link #ATTRIBUTE_TEST}
+ * or {@link #DOCUMENT_TEST}.
+ */
+ QName getLocalName() throws XPath20Exception;
+
+ /**
+ *
+ * @return
+ * @throws XPath20Exception
+ */
+ QName getNodeName() throws XPath20Exception;
+
+ /**
+ * Gets type name. See class description to see when to use this method.
+ * @return QName
+ * @throws XPath20Exception
+ */
+ QName getTypeName() throws XPath20Exception;
+
+ /**
+ * Gets schema context path. See class description to see when to use this method.
+ * @return String (?)
+ * @throws XPath20Exception
+ */
+ String getSchemaContext() throws XPath20Exception;
+
+ /**
+ * Gets the PITarget test or null if not specified.
+ * @return
+ * @throws XPath20Exception whenever the kind test is not
+ * {@link #PROCESSING_INSTRUCTION_TEST}.
+ */
+ String getPITarget() throws XPath20Exception;
+}
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/Leaver.java b/xpath_rwapi/src2/org/apache/xpath/expression/Leaver.java
new file mode 100644
index 0000000..748894c
--- /dev/null
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/Leaver.java
@@ -0,0 +1,56 @@
+/*
+ * Created on Aug 11, 2003
+ */
+package org.apache.xpath.expression;
+
+/**
+ * Callbacks for receiving "leave" events. A "leave" event is sent
+ * for an given expression part when all its sub expression parts
+ * was visited.
+ * @author <a href="mailto:villard@us.ibm.com">Lionel Villard</a>
+ * @version $Id$
+ */
+public interface Leaver
+{
+ /**
+ * Leave path expression
+ * @param path
+ */
+ void leavePath(PathExpr path);
+
+ /**
+ * Leave step expression
+ * @param
+ */
+ void leaveStep(StepExpr step);
+
+ /**
+ * Leave operator expression
+ * @param
+ *
+ */
+ void leaveOperator(OperatorExpr operator);
+
+ /**
+ * Leave conditional expression
+ * @param
+ */
+ void leaveConditional(ConditionalExpr condition);
+
+ /**
+ * Leave for or quantified expression
+ * @param
+ */
+ void leaveForOrQuantifiedExpr(ForAndQuantifiedExpr expr);
+
+ /**
+ * Leave instance of expression
+ */
+ void leaveInstanceOf(InstanceOfExpr expr);
+
+ /**
+ * Leave 'castable as' expression
+ */
+ void leaveCastableAs(CastableAsExpr expr);
+
+}
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/Literal.java b/xpath_rwapi/src2/org/apache/xpath/expression/Literal.java
index 916a2bd..e6517da 100644
--- a/xpath_rwapi/src2/org/apache/xpath/expression/Literal.java
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/Literal.java
@@ -62,18 +62,17 @@
/**
- * Represents literal expression type.
- * <pre>
- * [59] Literal ::= NumericLiteral | StringLiteral
- * [58] NumericLiteral ::= IntegerLiteral | DecimalLiteral | DoubleLiteral
- * [1] IntegerLiteral ::= Digits
- * [2] DecimalLiteral ::= ("." Digits) | (Digits "." [0-9]*)
- * [3] DoubleLiteral ::= (("." Digits) | (Digits ("." [0-9]*)?)) ("e" | "E") ("+" | "-")? Digits
- * [4] StringLiteral ::= ('"' (('"' '"') | [^"])* '"') | ("'" (("'" "'") | [^'])* "'")
- * </pre>
- *
- * @see <a href="http://www.w3.org/TR/xpath20#id-literals">XPath 2.0
- * Specification</a>
+ * Represents <em>literal</em> expressions.
+ * Use {@link #getLiteralType()} to get the type of literal, as following
+ * <ul>
+ * <li>{@link #INTEGER_LITERAL}: xs:integer datatype</li>
+ * <li>{@link #DOUBLE_LITERAL}: xs:double datatype</li>
+ * <li>{@link #DECIMAL_LITERAL}: xs:decimal datatype</li>
+ * <li>{@link #STRING_LITERAL}: xs:string datatype</li>
+ * </ul>
+ * @author <a href="mailto:villard@us.ibm.com">Lionel Villard</a>
+ * @version $Id$
+ * @see <a href="http://www.w3.org/TR/xpath20#id-literals">XPath 2.0 Specification</a>
*/
public interface Literal extends Expr
{
@@ -99,64 +98,52 @@
/**
* Gets the literal type
- *
* @return short One of the four following literal type:
- * <code>INTEGER_LITERAL</code>, <code>DECIMAL_LITERAL</code>,
- * <code>STRING_LITERAL</code>, <code>DOUBLE_LITERAL</code>.
+ * {@link #INTEGER_LITERAL}, {@link #DECIMAL_LITERAL},
+ * {@link #STRING_LITERAL}, {@link #DOUBLE_LITERAL}.
*/
short getLiteralType();
/**
- * Gets the integer literal
- *
- * @return DOCUMENT ME!
- *
- * @throws XPath20Exception when the literal isn't an integer or cannot be
- * represented by the primitive int type (in case of big integer)
+ * Gets the integer literal as primitive Java int type.
+ * @return int
+ * @throws XPath20Exception when the literal isn't an integer or when it cannot be
+ * represented as a primitive int type without approximations
*/
int getIntegerLiteralAsInt() throws XPath20Exception;
/**
- * Gets the integer literal
- *
- * @return DOCUMENT ME!
- *
+ * Gets the integer literal.
+ * @return BigInteger
* @throws XPath20Exception when the literal isn't an integer
*/
BigInteger getIntegerLiteral() throws XPath20Exception;
/**
* Gets the decimal literal
- *
- * @return DOCUMENT ME!
- *
+ * @return BigDecimal
* @throws XPath20Exception when the literal isn't a decimal
*/
BigDecimal getDecimalLiteral() throws XPath20Exception;
/**
* Gets the decimal literal as a double
- *
- * @return DOCUMENT ME!
- *
- * @throws XPath20Exception when the literal isn't a decimal
+ * @return double
+ * @throws XPath20Exception when the literal isn't a decimal or
+ * when it cannot be represented as a double without approximations
*/
double getDecimalLiteralAsDouble() throws XPath20Exception;
/**
* Gets the double literal
- *
- * @return DOCUMENT ME!
- *
+ * @return double
* @throws XPath20Exception when the literal isn't a double
*/
double getDoubleLiteral() throws XPath20Exception;
/**
* Gets the string literal
- *
- * @return DOCUMENT ME!
- *
+ * @return String
* @throws XPath20Exception when the literal isn't a string
*/
String getStringLiteral() throws XPath20Exception;
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/NameTest.java b/xpath_rwapi/src2/org/apache/xpath/expression/NameTest.java
new file mode 100644
index 0000000..aea06cf
--- /dev/null
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/NameTest.java
@@ -0,0 +1,50 @@
+/*
+ * Created on Aug 6, 2003
+ */
+package org.apache.xpath.expression;
+
+import org.apache.xml.QName;
+import org.apache.xpath.XPath20Exception;
+
+/**
+ * <em>NameTest</em> expression type.
+ * Dependings on the value returned by {@link #getNameTestType()},
+ * a name test have the following forms:
+ * <ul>
+ * <li>{@link #WILDCARD}: *</li>
+ * <li>{@link #NCNAME_WILDCARD}: ns:*</li>
+ * <li>{@link #WILDCARD_NCNAME}: *:ln</li>
+ * <li>{@link #QNAME}: (prefix?):localName</li>
+ * </ul>
+ * @author <a href="mailto:villard@us.ibm.com">Lionel Villard</a>
+ * @version $Id$
+ */
+public interface NameTest
+{
+ final short WILDCARD = 0;
+ final short NCNAME_WILDCARD = 1;
+ final short WILDCARD_NCNAME = 2;
+ final short QNAME = 3;
+
+ /**
+ * Gets the name test type
+ * @return One of the constants defined above
+ */
+ short getNameTestType();
+
+ /**
+ * Gets the qualified name of the name test.
+ * @return Qualified name
+ * @throws XPath20Exception when the name test type isn't
+ * {@link #QNAME}
+ */
+ QName getName() throws XPath20Exception;
+
+ /**
+ * Gets the namespace or the local part of the name test.
+ * @return NCName
+ * @throws XPath20Exception when the name test type isn't
+ * {@link #NCNAME_WILDCARD} or {@link #WILDCARD_NCNAME}
+ */
+ String getNCName() throws XPath20Exception;
+}
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/NodeTest.java b/xpath_rwapi/src2/org/apache/xpath/expression/NodeTest.java
index 57f088c..4b96a95 100644
--- a/xpath_rwapi/src2/org/apache/xpath/expression/NodeTest.java
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/NodeTest.java
@@ -55,12 +55,11 @@
*/
package org.apache.xpath.expression;
-import org.apache.xml.QName;
import org.apache.xpath.XPath20Exception;
/**
- * Represents an item test. An item test includes both node tests
- * and the context item test (dot).
+ * Represents an <em>item test</em>. An item test includes both node tests
+ * and the context item test (the character '.').
* <p>
* A node test is either a name test or a kind test. For the former, use
* the method {@link #getNameTest()} to get the {@link QName} involved in the test.
@@ -79,38 +78,53 @@
* @see <a href="http://www.w3.org/TR/xpath20/#doc-NodeTest">Node test specification</a>
* @see <a href="http://www.w3.org/TR/xpath20/#abbrev">Context item specification</a>
*/
-public interface NodeTest {
+public interface NodeTest extends Expr {
/**
- * The item test is a processing instruction kind test
+ * Processing instruction test (kind test)
*/
static final short PROCESSING_INSTRUCTION_TEST = 0;
/**
- * The item test is a comment kind test
+ * Comment test (kind test)
*/
static final short COMMENT_TEST = 1;
/**
- * The item test is any kind of test (except context item test)
+ * Any kind test (except context item test)
*/
static final short ANY_KIND_TEST = 2;
/**
- * The item test is a text kind test
+ * Text test (kind test)
*/
static final short TEXT_TEST = 3;
/**
+ * Document test (kind test)
+ */
+ static final short DOCUMENT_TEST = 4;
+
+ /**
+ * Element test (kind test)
+ */
+ static final short ELEMENT_TEST = 5;
+
+ /**
+ * Attribute test (kind test)
+ */
+ static final short ATTRIBUTE_TEST = 6;
+
+ /**
* The node test is a context item test (belong to the kind test group)
*/
- static final short CONTEXT_ITEM_TEST = 4;
+ static final short CONTEXT_ITEM_TEST = 7;
/**
- * Full name of kind tests.
+ * Full name of simple kind tests (whithout parameters).
* This array is synchronized with the kind test constants
*/
- static final String[] KIND_TEST_NAME = { "processing-instruction()", "comment()", "node()", "text()", "." };
+ static final String[] KIND_TEST_NAME = { "processing-instruction()", "comment()", "node()", "text()", "document-node()", "element()", "attribute()", "." };
/**
* Return true whenever this node test is a name test
@@ -128,6 +142,7 @@
* Gets the kind test code.
* @return short One of the kind test constant value
* @throws XPath20Exception whenever this node test isn't a kind test
+ * @deprecated cast to KindTest
*/
short getKindTest() throws XPath20Exception;
@@ -138,8 +153,9 @@
* @return QName The name test
* @throws XPath20Exception whenever this node test isn't a name test
* or a pi kind test
+ * @deprecated cast to NameTest
*/
- QName getNameTest() throws XPath20Exception;
+ NameTest getNameTest() throws XPath20Exception;
}
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/PathExpr.java b/xpath_rwapi/src2/org/apache/xpath/expression/PathExpr.java
index fde3d24..cec1030 100644
--- a/xpath_rwapi/src2/org/apache/xpath/expression/PathExpr.java
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/PathExpr.java
@@ -56,8 +56,8 @@
package org.apache.xpath.expression;
/**
- * Represents <em>path</em> expression. <quote>It can be used to locate nodes within a tree.</quote>
- * <p>A path expression consists of a series of {@link StepExpr}.
+ * Represents <em>path</em> expressions. <quote>It can be used to locate nodes within a tree.</quote>
+ * <p>A path expression consists of a sequence of {@link StepExpr}.
* It's a {@link OperatorExpr operator-based} expression
* with {@link OperatorExpr#SLASH_STEP} as the operator separator
* and {@link Expr#PATH_EXPR} as the operator type.
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/StepExpr.java b/xpath_rwapi/src2/org/apache/xpath/expression/StepExpr.java
index 3b4243e..76567aa 100644
--- a/xpath_rwapi/src2/org/apache/xpath/expression/StepExpr.java
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/StepExpr.java
@@ -57,189 +57,206 @@
import org.apache.xpath.XPath20Exception;
-
/**
- * Represents a step.
- * <quote>A step generates a sequence of items and then filters the sequence
- * by zero or more predicates.</quote>
+ * Represents <em>step</em> expressions.
+ * A step is either a <em>axis step</em> or an <em>filter step</em>.
* @see <a href="http://www.w3.org/TR/xpath20/#id-axis-steps">XPath 2.0
* specification</a>
+ * @author <a href="mailto:villard@us.ibm.com">Lionel Villard</a>
+ * @version $Id$
*/
public interface StepExpr extends Expr
{
- /**
- * Full name of axis. This array is kept in synchronization with axis
- * constants.
- */
- static final String[] FULL_AXIS_NAME =
- {
- "", "child", "descendant",
- "parent", "attribute", "self",
- "descendant-or-self", "ancestor",
- "following-sibling",
- "preceding-sibling", "following",
- "preceding", "namespace",
- "ancestor-or-self"
- };
+ /**
+ * Full name of axis. This array is kept in synchronization with axis
+ * constants.
+ */
+ static final String[] FULL_AXIS_NAME =
+ {
+ "",
+ "child",
+ "descendant",
+ "parent",
+ "attribute",
+ "self",
+ "descendant-or-self",
+ "ancestor",
+ "following-sibling",
+ "preceding-sibling",
+ "following",
+ "preceding",
+ "namespace",
+ "ancestor-or-self" };
- /**
- * The step axis is child
- */
- static final short AXIS_CHILD = 1;
+ /**
+ * The step axis is child
+ */
+ static final short AXIS_CHILD = 1;
- /**
- * The step axis is descendant
- */
- static final short AXIS_DESCENDANT = 2;
+ /**
+ * The step axis is descendant
+ */
+ static final short AXIS_DESCENDANT = 2;
- /**
- * The step axis is parent
- */
- static final short AXIS_PARENT = 3;
+ /**
+ * The step axis is parent
+ */
+ static final short AXIS_PARENT = 3;
- /**
- * The step axis is attribute
- */
- static final short AXIS_ATTRIBUTE = 4;
+ /**
+ * The step axis is attribute
+ */
+ static final short AXIS_ATTRIBUTE = 4;
- /**
- * The step axis is self
- */
- static final short AXIS_SELF = 5;
+ /**
+ * The step axis is self
+ */
+ static final short AXIS_SELF = 5;
- /**
- * The step axis is descendant or self
- */
- static final short AXIS_DESCENDANT_OR_SELF = 6;
+ /**
+ * The step axis is descendant or self
+ */
+ static final short AXIS_DESCENDANT_OR_SELF = 6;
- /**
- * The step axis is ancestor
- */
- static final short AXIS_ANCESTOR = 7;
+ /**
+ * The step axis is ancestor
+ */
+ static final short AXIS_ANCESTOR = 7;
- /**
- * The step axis is following sibling
- */
- static final short AXIS_FOLLOWING_SIBLING = 8;
+ /**
+ * The step axis is following sibling
+ */
+ static final short AXIS_FOLLOWING_SIBLING = 8;
- /**
- * The step axis is preceding sibling
- */
- static final short AXIS_PRECEDING_SIBLING = 9;
+ /**
+ * The step axis is preceding sibling
+ */
+ static final short AXIS_PRECEDING_SIBLING = 9;
- /**
- * The step axis is following
- */
- static final short AXIS_FOLLOWING = 10;
+ /**
+ * The step axis is following
+ */
+ static final short AXIS_FOLLOWING = 10;
- /**
- * The step axis is preceding
- */
- static final short AXIS_PRECEDING = 11;
+ /**
+ * The step axis is preceding
+ */
+ static final short AXIS_PRECEDING = 11;
- /**
- * The step axis is namespace
- */
- static final short AXIS_NAMESPACE = 12;
+ /**
+ * The step axis is namespace
+ */
+ static final short AXIS_NAMESPACE = 12;
- /**
- * The step axis is ancestor or self
- */
- static final short AXIS_ANCESTOR_OR_SELF = 13;
+ /**
+ * The step axis is ancestor or self
+ */
+ static final short AXIS_ANCESTOR_OR_SELF = 13;
- /**
- * Tells whether or not this step is a foward axis step
- * @return boolean
- */
- boolean isForwardStep();
+ /**
+ * Tells whether this step is a forward axis step.
+ * Includes the follwing axis:
+ * <ul>
+ * <li>{@link #AXIS_CHILD}</li>
+ * <li>{@link #AXIS_DESCENDANT}</li>
+ * <li>{@link #AXIS_DESCENDANT_OR_SELF}</li>
+ * <li>{@link #AXIS_ATTRIBUTE}</li>
+ * <li>{@link #AXIS_SELF}</li>
+ * <li>{@link #AXIS_FOLLOWING}</li>
+ * <li>{@link #AXIS_FOLLOWING_SIBLING}</li>
+ * <li>{@link #AXIS_NAMESPACE}</li>
+ * </ul>
+ * @return true whenever {@link #getAxisType()} returns one the
+ * constants right above.
+ */
+ boolean isForwardStep();
- /**
- * Tells whether or not this step is a reversed axis step
- * @return boolean
- */
- boolean isReversedStep();
+ /**
+ * Tells whether this step is a reversed axis step.
+ * Includes the following axis:
+ * <ul>
+ * <li>{@link #AXIS_PARENT}</li>
+ * <li>{@link #AXIS_ANCESTOR}</li>
+ * <li>{@link #AXIS_PRECEDING}</li>
+ * <li>{@link #AXIS_PRECEDING_SIBLING}</li>
+ * <li>{@link #AXIS_ANCESTOR_OR_SELF}</li>
+ * </ul>
+ * @return true whenever {@link #getAxisType()} returns one the
+ * constants right above.
+ */
+ boolean isReversedStep();
- /**
- * Tells whether or not this step is a filter step.
- * @return boolean
- */
- boolean isPrimaryExpr();
+ /**
+ * Tells whether this step is a filter step
+ * @return boolean
+ */
+ boolean isFilterStep();
- /**
- * Gets the type of step axis
- *
- * @return short The axis type corresponding to one of the constants defined above.
- * @throws XPath20Exception whenever the step is neither a forward step nor a reverse
- * step.
- */
- short getAxisType() throws XPath20Exception;
+ /**
+ * Gets the type of step axis
+ * @return short The axis type corresponding to one of the constants defined above.
+ * @throws XPath20Exception whenever the step isn't an axis step
+ */
+ short getAxisType() throws XPath20Exception;
- /**
- * Sets the type of the step axis
- * @param newType The new axis type
- * @throws XPath20Exception whenever the step is not a forward or reverse
- * step.
- */
- void setAxisType(short newType) throws XPath20Exception;
+ /**
+ * Sets the type of the step axis
+ * @param newType The new axis type
+ * @throws XPath20Exception whenever the step isn't an axis step
+ */
+ void setAxisType(short newType) throws XPath20Exception;
- /**
- * Gets the name of the step axis
- *
- * @return String Full name of the step axis
- * @throws XPath20Exception whenever the step is not a forward or reverse
- * step.
- */
- String getAxisName() throws XPath20Exception;
+ /**
+ * Gets the name of the step axis
+ * @return String Full name of the step axis
+ * @throws XPath20Exception whenever the step isn't an axis step
+ */
+ String getAxisName() throws XPath20Exception;
- /**
- * Gets the node test
- *
- * @return NodeTest
- * @throws XPath20Exception whenever the step is not a forward or reverse
- * step.
- */
- NodeTest getNodeTest() throws XPath20Exception;
-
+ /**
+ * Gets the node test
+ * @return NodeTest
+ * @throws XPath20Exception whenever the step isn't an axis step
+ */
+ NodeTest getNodeTest() throws XPath20Exception;
+
/**
* Sets the node test
- *
* @param NodeTest
- * @throws XPath20Exception whenever the step is not a forward or reverse
- * step.
+ * @throws XPath20Exception whenever the step isn't an axis step
*/
void setNodeTest(NodeTest test) throws XPath20Exception;
+ /**
+ * Gets the primary expression of the filter step.
+ * @return Expr The primary expression
+ * @throws XPath20Exception whenever the step isn't a filter step
+ */
+ Expr getPrimaryExpr() throws XPath20Exception;
- /**
- * Gets the step as a primary expression.
- *
- * @return Expr The primary expression
- */
- Expr getPrimaryExpr() throws XPath20Exception;
+ /**
+ * Gets the predicate expression at the specified position
+ * @param i index of the predicate to return
+ * @return The predicate at the ith position
+ * @throws java.lang.ArrayIndexOutOfBoundsException
+ */
+ Expr getPredicateAt(int i);
- /**
- * Gets the predicate expression at the specified position
- * @param i index of the predicate to return
- * @return The predicate at the ith position
- * @throws java.lang.ArrayIndexOutOfBoundsException
- */
- Expr getPredicateAt(int i);
+ /**
+ * Gets the number of predicate
+ * @return The number of predicates
+ */
+ int getPredicateCount();
- /**
- * Gets the number of predicate
- *
- * @return The number of predicates
- */
- int getPredicateCount();
+ /**
+ * Append the specified predicate at the end of the list of
+ * predicates
+ * @param predicate The predicate to append
+ */
+ void appendPredicate(Expr predicate);
- /**
- * Append the specified predicate
- * @param predicate The predicate to append
- */
- void appendPredicate(Expr predicate);
-
- /**
- * Remove the specified predicate
- */
- void removePredicate(Expr predicate);
+ /**
+ * Remove the specified predicate
+ */
+ void removePredicate(Expr predicate);
}
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/Variable.java b/xpath_rwapi/src2/org/apache/xpath/expression/Variable.java
index c86af80..13eadf1 100644
--- a/xpath_rwapi/src2/org/apache/xpath/expression/Variable.java
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/Variable.java
@@ -59,16 +59,19 @@
import org.apache.xpath.XPath20Exception;
/**
- * Represents variable.
+ * Represents <em>variable</em> references.
+ * @author <a href="mailto:villard@us.ibm.com">Lionel Villard</a>
+ * @version $Id$
*/
-public interface Variable extends Expr {
+public interface Variable extends Expr
+{
- /**
- * Gets the name of the variable.
- * @return String
- */
- QName getVariableName();
-
+ /**
+ * Gets the name of the variable.
+ * @return String
+ */
+ QName getVariableName();
+
/**
* Sets the name of the variable.
* @param name New name of the variable
diff --git a/xpath_rwapi/src2/org/apache/xpath/expression/package.html b/xpath_rwapi/src2/org/apache/xpath/expression/package.html
index 689ec96..c32a94f 100644
--- a/xpath_rwapi/src2/org/apache/xpath/expression/package.html
+++ b/xpath_rwapi/src2/org/apache/xpath/expression/package.html
@@ -6,21 +6,25 @@
<body>
<p>Public interfaces for XPath expression Abstract Syntax Tree nodes.
Primary external APIs for this XPath AST model.</p>
-<p>This XPath API is a compact set of Java interfaces that allow to
-encode and handle XPath 2.0/XQuery 1.0 expressions (although only XPath
-2.0 expressions are currently supported except for the let expression).
-It was designed to fulfill
+<p>This XPath API is a compact set of Java interfaces that allow the
+in-memory representation and manipulation of XPath 2.0 expressions.The
+main idea of this API is to manipulate XPath expressions independently
+of their actual underlying representation.<br>
+</p>
+<p>It was designed to fulfill
the following requirements:</p>
<ul>
<li style="font-weight: bold;">Read/Write: <span
- style="font-weight: normal;">capability of visiting and modifying the
-internal representation of expressions. The expression reading is
+ style="font-weight: normal;">it should be capable of querying/visiting
+and modifying the
+internal representation of XPath expressions. The expression reading is
performed by using either the visitor pattern or get-like methods.
Similarly, the</span><span style="font-weight: normal;"> expression </span><span
style="font-weight: normal;">writing is done through a bunch of
set-like methods.</span></li>
<li style="font-weight: bold;"><span style="font-weight: normal;"><span
- style="font-weight: bold;">Round-trip: </span>capability of getting
+ style="font-weight: bold;">Round-trip: </span>it should be capable of
+getting
string representation of expressions from its internal encoding.<br>
</span></li>
<li><span style="font-weight: bold;">Application-independent</span>:
@@ -30,14 +34,15 @@
namespace/qname manager and AST generalization and specialisation (see
implementation package).<span style="font-weight: bold;"><br>
</span></li>
- <li style="font-weight: bold;">Compactness: <span
- style="font-weight: normal;">keep the interface set as minimal as
-possible by factoring similar concepts. The best example is the
-interface OperatorExpr which allows to represent more than ten
+ <li style="font-weight: bold;">Lightweight: <span
+ style="font-weight: normal;">it should be compact and therefore should
+define a minimal set of Java interfaces in particular by factoring
+similar concepts. The best example is the
+interface OperatorExpr which allows the representation of more than ten
expression types.</span></li>
</ul>
-Right now, the XPath API do not provide a standard way to evaluate
-expressions. This should be done.<br>
+Right now, the XPath API do not provide a standard way to request the
+evaluation of expressions. This should be done.<br>
<p></p>
</body>
</html>
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/KindTestImpl.java b/xpath_rwapi/src2/org/apache/xpath/impl/KindTestImpl.java
index 25b0f4a..8e50990 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/KindTestImpl.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/KindTestImpl.java
@@ -55,10 +55,11 @@
*/
package org.apache.xpath.impl;
-import org.apache.xml.QName;
-
import org.apache.xpath.XPath20Exception;
+import org.apache.xpath.expression.Expr;
+import org.apache.xpath.expression.NameTest;
import org.apache.xpath.expression.NodeTest;
+import org.apache.xpath.expression.Visitor;
import org.apache.xpath.impl.parser.Node;
import org.apache.xpath.impl.parser.SimpleNode;
import org.apache.xpath.impl.parser.XPath;
@@ -80,7 +81,7 @@
/**
* PI target
*/
- protected QName m_pitarget;
+ protected NameTestImpl m_pitarget;
/**
* Creates an any kind test node. Internal uses only
@@ -154,7 +155,7 @@
/**
* @see org.apache.xpath.expression.NodeTest#getLocalNameTest()
*/
- public QName getNameTest() throws XPath20Exception
+ public NameTest getNameTest() throws XPath20Exception
{
if (m_kindTest == PROCESSING_INSTRUCTION_TEST)
{
@@ -166,14 +167,30 @@
}
}
- /**
- * @see org.apache.xpath.expression.Expr#getString(boolean)
- */
+ // Implements Expr
+
public String getString(boolean abbreviate)
{
return KIND_TEST_NAME[m_kindTest];
}
+ public Expr cloneExpression()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public short getExprType()
+ {
+ return Expr.NODE_TEST;
+ }
+
+ public boolean visit(Visitor visitor)
+ {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
/**
* @see org.apache.xpath.impl.parser.Node#jjtAddChild(Node, int)
*/
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/NameTestImpl.java b/xpath_rwapi/src2/org/apache/xpath/impl/NameTestImpl.java
index 7ead8fb..0542832 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/NameTestImpl.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/NameTestImpl.java
@@ -56,111 +56,174 @@
package org.apache.xpath.impl;
import org.apache.xml.QName;
-
import org.apache.xpath.XPath20Exception;
+import org.apache.xpath.expression.Expr;
+import org.apache.xpath.expression.NameTest;
import org.apache.xpath.expression.NodeTest;
+import org.apache.xpath.expression.Visitor;
import org.apache.xpath.impl.parser.Node;
+import org.apache.xpath.impl.parser.QNameWrapper;
import org.apache.xpath.impl.parser.SimpleNode;
import org.apache.xpath.impl.parser.XPathTreeConstants;
-
/**
* Default implementation of name test.
*/
-public class NameTestImpl extends SimpleNode implements NodeTest
+public class NameTestImpl extends SimpleNode implements NodeTest, NameTest
{
- /**
- * Name test
- */
- QName m_qname;
+ /**
+ * Name test
+ */
+ QName m_qname;
- /**
- * Constructor for NameTestImpl. Internal uses only
- *
- * @param i
- */
- public NameTestImpl(int i)
- {
- super(i);
- }
+ /**
+ * NCName
+ */
+ String m_ncname;
- /**
- * Constructor for NodeTestImpl. Internal uses only
- */
- public NameTestImpl(QName qname)
- {
- super(XPathTreeConstants.JJTNAMETEST);
+ /**
+ * Nametest type
+ */
+ short m_type;
- m_qname = qname;
- }
-
- /**
- * @see org.apache.xpath.expression.NodeTest#isNameTest()
- */
- public boolean isNameTest()
- {
- return true;
- }
+ // Constructors
- /**
- * @see org.apache.xpath.expression.NodeTest#isKindTest()
- */
- public boolean isKindTest()
- {
- return false;
- }
+ /**
+ * Constructor for NameTestImpl. Internal uses only
+ *
+ * @param i
+ */
+ public NameTestImpl(int i)
+ {
+ super(i);
+ }
- /**
- * @see org.apache.xpath.expression.NodeTest#getKindTest()
- */
- public short getKindTest() throws XPath20Exception
- {
- throw new XPath20Exception("Invalid call of this method on NameTest node"); //I8
- }
+ /**
+ * Constructor for NodeTestImpl. Internal uses only
+ */
+ public NameTestImpl(QName qname)
+ {
+ super(XPathTreeConstants.JJTNAMETEST);
- /**
- * @see org.apache.xpath.expression.NodeTest#getLocalNameTest()
- */
- public QName getNameTest() throws XPath20Exception
- {
- return m_qname;
- }
-
- /**
- * @see org.apache.xpath.expression.Expr#getString(boolean)
- */
- public String getString(boolean abbreviate)
- {
- return m_qname.toString();
- }
+ m_qname = qname;
+ m_type = QNAME;
+ }
-
- /**
- * @see org.apache.xpath.impl.parser.Node#jjtAddChild(Node, int)
- */
- public void jjtAddChild(Node n, int i)
- {
- // don't add n in the tree
- m_qname = ((org.apache.xpath.impl.parser.QNameWrapper) n).getQName();
- }
+ /**
+ * @see org.apache.xpath.expression.NodeTest#isNameTest()
+ */
+ public boolean isNameTest()
+ {
+ return true;
+ }
- /**
- * @see org.apache.xpath.impl.ExprImpl#getString(StringBuffer,
- * boolean)
- */
- public void getString(StringBuffer expr, boolean abbreviate)
- {
- expr.append(m_qname.toString());
- }
+ /**
+ * @see org.apache.xpath.expression.NodeTest#isKindTest()
+ */
+ public boolean isKindTest()
+ {
+ return false;
+ }
- /**
- * Override to print out useful instance data.
- *
- * @see org.apache.xpath.impl.parser.SimpleNode#toString()
- */
- public String toString()
- {
- return XPathTreeConstants.jjtNodeName[id] + " " + getClass() + " "
- + getString(false);
- }
+ /**
+ * @see org.apache.xpath.expression.NodeTest#getKindTest()
+ */
+ public short getKindTest() throws XPath20Exception
+ {
+ throw new XPath20Exception("Invalid call of this method on NameTest node");
+ //I8
+ }
+
+ /**
+ * @see org.apache.xpath.expression.NodeTest#getLocalNameTest()
+ */
+ public NameTest getNameTest() throws XPath20Exception
+ {
+ return this;
+ }
+
+ // Implements Expr
+
+ public String getString(boolean abbreviate)
+ {
+ switch (m_type)
+ {
+ case WILDCARD :
+ return "*";
+ case QNAME :
+ return m_qname.toString();
+ case NCNAME_WILDCARD :
+ return m_ncname + ":*";
+ case WILDCARD_NCNAME :
+ return "*:" + m_ncname;
+ default:
+ throw new IllegalStateException("Invalid NameTest type " + m_type);
+ }
+ }
+
+ //
+ public Expr cloneExpression()
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public short getExprType()
+ {
+ return NODE_TEST;
+ }
+
+ //
+ public boolean visit(Visitor visitor)
+ {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public void jjtAddChild(Node n, int i)
+ {
+ QNameWrapper w = (QNameWrapper) n;
+
+ m_type = w.m_type;
+ m_ncname = w.m_ncname;
+ m_qname = w.getQName();
+ }
+
+ public void getString(StringBuffer expr, boolean abbreviate)
+ {
+ expr.append(getString(abbreviate));
+ }
+
+ /**
+ * Override to print out useful instance data.
+ *
+ * @see org.apache.xpath.impl.parser.SimpleNode#toString()
+ */
+ public String toString()
+ {
+ return XPathTreeConstants.jjtNodeName[id]
+ + " "
+ + getClass()
+ + " "
+ + getString(false);
+ }
+
+ // Implements NameTest
+
+ public QName getName()
+ {
+ return m_qname;
+ }
+
+ public String getNCName()
+ {
+ return m_ncname;
+ }
+
+ public short getNameTestType()
+ {
+ return m_type;
+ }
+
+
}
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/PathExprImpl.java b/xpath_rwapi/src2/org/apache/xpath/impl/PathExprImpl.java
index a50bb44..27f2f0c 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/PathExprImpl.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/PathExprImpl.java
@@ -206,7 +206,7 @@
int et = step.getExprType();
return (
- ((et == STEP) && ((StepExpr) step).isPrimaryExpr())
+ ((et == STEP) && ((StepExpr) step).isFilterStep())
|| (et == LITERAL_EXPR)
|| (et == FUNCTION_CALL_EXPR)
|| (et == SEQUENCE_EXPR)
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/StepExprImpl.java b/xpath_rwapi/src2/org/apache/xpath/impl/StepExprImpl.java
index 9355394..078614f 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/StepExprImpl.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/StepExprImpl.java
@@ -194,7 +194,7 @@
/**
* @see org.apache.xpath.expression.StepExpr#isPrimaryExpr()
*/
- public boolean isPrimaryExpr()
+ public boolean isFilterStep()
{
return m_axisType == STEP_IS_PRIMARYEXPR;
}
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/parser/Axis.java b/xpath_rwapi/src2/org/apache/xpath/impl/parser/Axis.java
index 9a09466..7d87244 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/parser/Axis.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/parser/Axis.java
@@ -58,7 +58,7 @@
import org.apache.xpath.expression.StepExpr;
/**
- * Represent an Axis AST node.
+ * Represents an Axis AST node.
*/
public class Axis extends SimpleNode {
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/parser/DefaultNodeFactory.java b/xpath_rwapi/src2/org/apache/xpath/impl/parser/DefaultNodeFactory.java
index a5458c5..d676604 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/parser/DefaultNodeFactory.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/parser/DefaultNodeFactory.java
@@ -81,8 +81,6 @@
public class DefaultNodeFactory implements NodeFactory
{
- final static public String FACTORY_PROPERTY_KEY = "org.apache.xpath.impl.parser.NodeFactory";
-
final static private NodeFactory DEFAULT_NODE_FACTORY = new DefaultNodeFactory();
static protected NodeFactory createNodeFactory()
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/parser/NodeFactory.java b/xpath_rwapi/src2/org/apache/xpath/impl/parser/NodeFactory.java
index 64830dc..d185489 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/parser/NodeFactory.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/parser/NodeFactory.java
@@ -75,6 +75,10 @@
*/
public interface NodeFactory
{
+ final static public String FACTORY_PROPERTY_KEY = "org.apache.xpath.impl.parser.NodeFactory";
+
+
+
/**
* Creates NameTest AST node
*
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/parser/QNameWrapper.java b/xpath_rwapi/src2/org/apache/xpath/impl/parser/QNameWrapper.java
index 507150d..cd6f407 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/parser/QNameWrapper.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/parser/QNameWrapper.java
@@ -56,6 +56,7 @@
package org.apache.xpath.impl.parser;
import org.apache.xml.QName;
+import org.apache.xpath.expression.NameTest;
/**
* QNameNode wrappers a 'real' QName object.
@@ -69,6 +70,9 @@
* The wrapped QName
*/
QName m_qname;
+
+ public short m_type;
+ public String m_ncname;
/**
* Constructor for QName.
@@ -89,36 +93,31 @@
super(p, i);
}
- /**
- * @see org.apache.xpath.impl.parser.SimpleNode#processToken(Token)
- */
public void processToken(Token t)
{
super.processToken(t);
- String qname;
+
switch (id)
{
case XPathTreeConstants.JJTSTAR :
- m_qname =
- SimpleNode.getExpressionFactory().createQName(
- null,
- "*",
- null);
+ m_type = NameTest.WILDCARD;
break;
case XPathTreeConstants.JJTSTARCOLONNCNAME :
- qname = t.image.trim();
- qname = qname.substring(qname.indexOf(":") + 1);
- m_qname =
- SimpleNode.getExpressionFactory().createQName(
- null,
- qname,
- "*");
+ m_ncname = t.image.trim();
+ m_ncname = m_ncname.substring(m_ncname.indexOf(":") + 1);
+ m_type = NameTest.WILDCARD_NCNAME;
break;
case XPathTreeConstants.JJTNCNAMECOLONSTAR :
+ m_ncname = t.image.trim();
+ m_ncname = m_ncname.substring(0, m_ncname.indexOf(":"));
+ m_type = NameTest.NCNAME_WILDCARD;
+
+ break;
+
case XPathTreeConstants.JJTQNAME :
case XPathTreeConstants.JJTQNAMELPAR :
- qname = t.image;
+ String qname = t.image;
int parenIndex = qname.lastIndexOf("(");
if (parenIndex > 0)
{
@@ -133,8 +132,7 @@
null,
qname,
null);
- }
- else
+ } else
{
m_qname =
SimpleNode.getExpressionFactory().createQName(
@@ -142,6 +140,7 @@
qname.substring(colonIdx + 1),
qname.substring(0, colonIdx));
}
+ m_type = NameTest.QNAME;
break;
default :
@@ -150,9 +149,7 @@
}
}
- /**
- * @return org.apache.xml.QName
- */
+
public org.apache.xml.QName getQName()
{
return m_qname;
diff --git a/xpath_rwapi/src2/org/apache/xpath/impl/parser/SimpleNode.java b/xpath_rwapi/src2/org/apache/xpath/impl/parser/SimpleNode.java
index a9984b6..b11b840 100644
--- a/xpath_rwapi/src2/org/apache/xpath/impl/parser/SimpleNode.java
+++ b/xpath_rwapi/src2/org/apache/xpath/impl/parser/SimpleNode.java
@@ -243,15 +243,15 @@
break;
// The nodes belows are filtered: no customisation possible
- case XPathTreeConstants.JJTQNAME:
- case XPathTreeConstants.JJTQNAMELPAR:
+
case XPathTreeConstants.JJTSTAR:
case XPathTreeConstants.JJTNCNAMECOLONSTAR:
case XPathTreeConstants.JJTSTARCOLONNCNAME:
- newNode = new QNameWrapper(id);
-
- break;
-
+ case XPathTreeConstants.JJTQNAME:
+ case XPathTreeConstants.JJTQNAMELPAR:
+ newNode = new QNameWrapper(id);
+ break;
+
case XPathTreeConstants.JJTDOTDOT:
newNode = Singletons.DOTDOT;