package client.net.sf.saxon.ce.expr; import client.net.sf.saxon.ce.Configuration; import client.net.sf.saxon.ce.Controller; import client.net.sf.saxon.ce.event.Receiver; import client.net.sf.saxon.ce.event.SequenceReceiver; import client.net.sf.saxon.ce.expr.instruct.LocalParam; import client.net.sf.saxon.ce.expr.instruct.ParameterSet; import client.net.sf.saxon.ce.expr.sort.GroupIterator; import client.net.sf.saxon.ce.om.*; import client.net.sf.saxon.ce.regex.RegexIterator; import client.net.sf.saxon.ce.trans.Mode; import client.net.sf.saxon.ce.trans.NoDynamicContextException; import client.net.sf.saxon.ce.trans.Rule; import client.net.sf.saxon.ce.trans.XPathException; import client.net.sf.saxon.ce.value.DateTimeValue; /** * This class represents a context in which an XPath expression is evaluated. */ public interface XPathContext { /** * Construct a new context as a copy of another. The new context is effectively added * to the top of a stack, and contains a pointer to the previous context * @return a new context, created as a copy of this context */ public XPathContextMajor newContext(); /** * Construct a new context without copying (used for the context in a function call) * @return a new clean context */ public XPathContextMajor newCleanContext(); /** * Construct a new minor context. A minor context can only hold new values of the focus * (currentIterator) and current output destination. * @return a new minor context */ public XPathContextMinor newMinorContext(); /** * Get the local (non-tunnel) parameters that were passed to the current function or template * @return a ParameterSet containing the local parameters */ public ParameterSet getLocalParameters(); /** * Get the tunnel parameters that were passed to the current function or template. This includes all * active tunnel parameters whether the current template uses them or not. * @return a ParameterSet containing the tunnel parameters */ public ParameterSet getTunnelParameters(); /** * Get the Controller. May return null when running outside XSLT or XQuery * @return the controller for this query or transformation */ public Controller getController(); /** * Get the Configuration * @return the Saxon configuration object */ public Configuration getConfiguration(); /** * Get the Name Pool * @return the name pool */ public NamePool getNamePool(); /** * Set the calling XPathContext * @param caller the XPathContext of the calling expression */ public void setCaller(XPathContext caller); /** * Get the calling XPathContext (the next one down the stack). This will be null if unknown, or * if the bottom of the stack has been reached. * @return the XPathContext of the calling expression */ public XPathContext getCaller(); /** * Set a new sequence iterator. * @param iter the current iterator. The context item, position, and size are determined by reference * to the current iterator. */ public void setCurrentIterator(SequenceIterator iter); /** * Get the current iterator. * This encapsulates the context item, context position, and context size. * @return the current iterator, or null if there is no current iterator * (which means the context item, position, and size are undefined). */ public SequenceIterator getCurrentIterator(); /** * Get the context position (the position of the context item) * @return the context position (starting at one) * @throws XPathException if the context position is undefined */ public int getContextPosition() throws XPathException; /** * Get the context item * @return the context item, or null if the context item is undefined */ public Item getContextItem(); /** * Get the context size (the position of the last item in the current node list) * @return the context size * @throws XPathException if the context position is undefined */ public int getLast() throws XPathException; /** * Determine whether the context position is the same as the context size * that is, whether position()=last(). In many cases this has better performance * than a direct comparison, because it does not require reading to the end of the * sequence. * @return true if the context position is the same as the context size. */ public boolean isAtLast() throws XPathException; /** * Use local parameter. This is called when a local xsl:param element is processed. * If a parameter of the relevant name was supplied, it is bound to the xsl:param element. * Otherwise the method returns false, so the xsl:param default will be evaluated * @param qName The fingerprint of the parameter name * @param binding The XSLParam element to bind its value to * @param isTunnel True if a tunnel parameter is required, else false * @return ParameterSet.NOT_SUPPLIED, ParameterSet.SUPPLIED, or ParameterSet.SUPPLIED_AND_CHECKED */ public int useLocalParameter(StructuredQName qName, LocalParam binding, boolean isTunnel) throws XPathException; /** * Get a reference to the local stack frame for variables. Note that it's * the caller's job to make a local copy of this. This is used for creating * a Closure containing a retained copy of the variables for delayed evaluation. * @return array of variables. */ public StackFrame getStackFrame(); /** * Get the value of a local variable, identified by its slot number * @param slotnumber the slot number allocated at compile time to the variable, * which identifies its position within the local stack frame * @return the value of the variable. */ public ValueRepresentation evaluateLocalVariable(int slotnumber); /** * Set the value of a local variable, identified by its slot number * @param slotnumber the slot number allocated at compile time to the variable, * which identifies its position within the local stack frame * @param value the value of the variable */ public void setLocalVariable(int slotnumber, ValueRepresentation value); /** * Set a new output destination, supplying the output format details. <BR> * Note that it is the caller's responsibility to close the Writer after use. * * @exception XPathException if any dynamic error occurs; and * specifically, if an attempt is made to switch to a final output * destination while writing a temporary tree or sequence @param isFinal true if the destination is a final result tree * (either the principal output or a secondary result tree); false if not */ public void changeOutputDestination(Receiver receiver, boolean isFinal ) throws XPathException; /** * Set the SequenceReceiver to which output is to be written, marking it as a temporary (non-final) * output destination. * @param out The SequenceReceiver to be used */ public void setTemporaryReceiver(SequenceReceiver out); /** * Change the SequenceReceiver to which output is written * @param receiver the SequenceReceiver to be used */ public void setReceiver(SequenceReceiver receiver); /** * Get the Receiver to which output is currently being written. * @return the current SequenceReceiver */ public SequenceReceiver getReceiver(); /** * Get the current mode. * @return the current mode */ public Mode getCurrentMode(); /** * Get the current template rule. This is used to support xsl:apply-imports and xsl:next-match * @return the current template rule */ public Rule getCurrentTemplateRule(); /** * Get the current group iterator. This supports the current-group() and * current-grouping-key() functions in XSLT 2.0 * @return the current grouped collection */ public GroupIterator getCurrentGroupIterator(); /** * Get the current regex iterator. This supports the functionality of the regex-group() * function in XSLT 2.0. * @return the current regular expressions iterator */ public RegexIterator getCurrentRegexIterator(); /** * Get the current date and time * @return the current date and time. All calls within a single query or transformation * will return the same value */ public DateTimeValue getCurrentDateTime() throws NoDynamicContextException; /** * Get the implicit timezone * @return the implicit timezone. This will be the timezone of the current date and time, and * all calls within a single query or transformation will return the same value. The result is * expressed as an offset from UTC in minutes. */ public int getImplicitTimezone() throws NoDynamicContextException; public XPathException getCurrentException(); } // This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. // If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. // This Source Code Form is “Incompatible With Secondary Licenses”, as defined by the Mozilla Public License, v. 2.0.