net.sf.saxon.expr
Class PathMap
java.lang.Object
net.sf.saxon.expr.PathMap
public class PathMap
extends java.lang.Object
A PathMap is a description of all the paths followed by an expression.
It is a set of trees. Each tree contains as its root an expression that selects
nodes without any dependency on the context. The arcs in the tree are axis steps.
So the expression doc('a.xml')/a[b=2]/c has a single root (the call on doc()), with
a single arc representing child::a, this leads to a node which has two further arcs
representing child::b and child::c. Because element b is atomized, there will also be
an arc for the step descendant::text() indicating the requirement to access the text
nodes of the element.
The current implementation works only for XPath 2.0 expressions (for example, constructs
like xsl:for-each-group are not handled.)
This class, together with the overloaded method
Expression.addToPathMap(PathMap,PathMap.PathMapNodeSet)
can be
seen as an implementation of the static path analysis algorithm given in section 4 of
A. Marian and J. Simeon,
Projecting XML Documents, VLDB 2003.
PathMap
public PathMap(Expression exp)
Create the PathMap for an expression
exp
- the expression whose PathMap is required
diagnosticDump
public void diagnosticDump(PrintStream out)
Display a printed representation of the path map
out
- the output stream to which the output will be written
getContextRoot
public PathMap.PathMapRoot getContextRoot()
Get the path map root for the context document
- the path map root for the context document if there is one, or null if none is found.
getPathForVariable
public PathMap.PathMapNodeSet getPathForVariable(Binding binding)
Get the path used when evaluating a given variable binding
binding
- the variable binding
- the set of PathMap nodes reachable when evaluating that variable
getPathMapRoots
public PathMap.PathMapRoot[] getPathMapRoots()
Get all the root expressions from the path map
- an array containing the root expressions
getRootForDocument
public PathMap.PathMapRoot getRootForDocument(String requiredUri)
Get the path map root for a call on the doc() or document() function with a given literal argument
requiredUri
- the literal argument we are looking for
- the path map root for the specified document if there is one, or null if none is found.
main
public static void main(String[] args)
throws Exception
Main method for testing
args
- Takes one argument, the XPath expression to be analyzed
makeNewRoot
public PathMap.PathMapRoot makeNewRoot(Expression exp)
Make a new root node in the path map. However, if there is already a root for the same
expression, the existing root for that expression is returned.
exp
- the expression represented by this root node
reduceToDownwardsAxes
public PathMap.PathMapRoot reduceToDownwardsAxes(PathMap.PathMapRoot root)
Given a PathMapRoot, simplify the tree rooted at this node so that
it only contains downwards selections: specifically, so that the only axes
used are child, attribute, namespace, and descendant. If the root expression
is a ContextItemExpression (that is, the path can start at any node) then it is rebased
to start at a root node, which means in effect that a path such as a/b/c is treated
as //a/b/c.
root
- the root of the path to be simplified
- the path map root after converting the tree to use downwards axes only
registerPathForVariable
public void registerPathForVariable(Binding binding,
PathMap.PathMapNodeSet nodeset)
Register the path used when evaluating a given variable binding
binding
- the variable bindingnodeset
- the set of PathMap nodes reachable when evaluating that variable