ContextMatchStepPatternpublic class ContextMatchStepPattern extends StepPattern Special context node pattern matcher. |
Constructors Summary |
---|
public ContextMatchStepPattern(int axis, int paxis)Construct a ContextMatchStepPattern.
super(DTMFilter.SHOW_ALL, axis, paxis);
|
Methods Summary |
---|
public com.sun.org.apache.xpath.internal.objects.XObject | execute(com.sun.org.apache.xpath.internal.XPathContext xctxt)Execute this pattern step, including predicates.
if (xctxt.getIteratorRoot() == xctxt.getCurrentNode())
return getStaticScore();
else
return this.SCORE_NONE;
| public com.sun.org.apache.xpath.internal.objects.XObject | executeRelativePathPattern(com.sun.org.apache.xpath.internal.XPathContext xctxt, com.sun.org.apache.xpath.internal.patterns.StepPattern prevStep)Execute the match pattern step relative to another step.
XObject score = NodeTest.SCORE_NONE;
int context = xctxt.getCurrentNode();
DTM dtm = xctxt.getDTM(context);
if (null != dtm)
{
int predContext = xctxt.getCurrentNode();
DTMAxisTraverser traverser;
int axis = m_axis;
boolean needToTraverseAttrs = WalkerFactory.isDownwardAxisOfMany(axis);
boolean iterRootIsAttr = (dtm.getNodeType(xctxt.getIteratorRoot())
== DTM.ATTRIBUTE_NODE);
if((Axis.PRECEDING == axis) && iterRootIsAttr)
{
axis = Axis.PRECEDINGANDANCESTOR;
}
traverser = dtm.getAxisTraverser(axis);
for (int relative = traverser.first(context); DTM.NULL != relative;
relative = traverser.next(context, relative))
{
try
{
xctxt.pushCurrentNode(relative);
score = execute(xctxt);
if (score != NodeTest.SCORE_NONE)
{
//score = executePredicates( xctxt, prevStep, SCORE_OTHER,
// predContext, relative);
if (executePredicates(xctxt, dtm, context))
return score;
score = NodeTest.SCORE_NONE;
}
if(needToTraverseAttrs && iterRootIsAttr
&& (DTM.ELEMENT_NODE == dtm.getNodeType(relative)))
{
int xaxis = Axis.ATTRIBUTE;
for (int i = 0; i < 2; i++)
{
DTMAxisTraverser atraverser = dtm.getAxisTraverser(xaxis);
for (int arelative = atraverser.first(relative);
DTM.NULL != arelative;
arelative = atraverser.next(relative, arelative))
{
try
{
xctxt.pushCurrentNode(arelative);
score = execute(xctxt);
if (score != NodeTest.SCORE_NONE)
{
//score = executePredicates( xctxt, prevStep, SCORE_OTHER,
// predContext, arelative);
if (score != NodeTest.SCORE_NONE)
return score;
}
}
finally
{
xctxt.popCurrentNode();
}
}
xaxis = Axis.NAMESPACE;
}
}
}
finally
{
xctxt.popCurrentNode();
}
}
}
return score;
|
|