FileDocCategorySizeDatePackage
FuncPosition.javaAPI DocJava SE 5 API4063Fri Aug 26 14:56:08 BST 2005com.sun.org.apache.xpath.internal.functions

FuncPosition

public class FuncPosition extends Function
Execute the Position() function.
xsl.usage
advanced

Fields Summary
private boolean
m_isTopLevel
Constructors Summary
Methods Summary
public com.sun.org.apache.xpath.internal.objects.XObjectexecute(com.sun.org.apache.xpath.internal.XPathContext xctxt)
Execute the function. The function must return a valid object.

param
xctxt The current execution context.
return
A valid XObject.
throws
javax.xml.transform.TransformerException

    double pos = (double) getPositionInContextNodeList(xctxt);
    
    return new XNumber(pos);
  
public voidfixupVariables(java.util.Vector vars, int globalsSize)
No arguments to process, so this does nothing.

    // no-op
  
public intgetPositionInContextNodeList(com.sun.org.apache.xpath.internal.XPathContext xctxt)
Get the position in the current context node list.

param
xctxt Runtime XPath context.
return
The current position of the itteration in the context node list, or -1 if there is no active context node list.


    // System.out.println("FuncPosition- entry");
    // If we're in a predicate, then this will return non-null.
    SubContextList iter = m_isTopLevel ? null : xctxt.getSubContextList();

    if (null != iter)
    {
      int prox = iter.getProximityPosition(xctxt);
 
      // System.out.println("FuncPosition- prox: "+prox);
      return prox;
    }

    DTMIterator cnl = xctxt.getContextNodeList();

    if (null != cnl)
    {
      int n = cnl.getCurrentNode();
      if(n == DTM.NULL)
      {
        if(cnl.getCurrentPos() == 0)
          return 0;
          
        // Then I think we're in a sort.  See sort21.xsl. So the iterator has 
        // already been spent, and is not on the node we're processing. 
        // It's highly possible that this is an issue for other context-list 
        // functions.  Shouldn't be a problem for last(), and it shouldn't be 
        // a problem for current().
        try 
        { 
          cnl = cnl.cloneWithReset(); 
        }
        catch(CloneNotSupportedException cnse)
        {
          throw new com.sun.org.apache.xml.internal.utils.WrappedRuntimeException(cnse);
        }
        int currentNode = xctxt.getContextNode();
        // System.out.println("currentNode: "+currentNode);
        while(DTM.NULL != (n = cnl.nextNode()))
        {
          if(n == currentNode)
            break;
        }
      }
      // System.out.println("n: "+n);
      // System.out.println("FuncPosition- cnl.getCurrentPos(): "+cnl.getCurrentPos());
      return cnl.getCurrentPos();
    }

    // System.out.println("FuncPosition - out of guesses: -1");
    return -1;
  
public voidpostCompileStep(com.sun.org.apache.xpath.internal.compiler.Compiler compiler)
Figure out if we're executing a toplevel expression. If so, we can't be inside of a predicate.

    m_isTopLevel = compiler.getLocationPathDepth() == -1;