Search in sources :

Example 31 with XObject

use of org.apache.xpath.objects.XObject in project j2objc by google.

the class ElemNumber method getCountString.

/**
 * Given an XML source node, get the count according to the
 * parameters set up by the xsl:number attributes.
 * @param transformer non-null reference to the the current transform-time state.
 * @param sourceNode The source node being counted.
 *
 * @return The count of nodes
 *
 * @throws TransformerException
 */
String getCountString(TransformerImpl transformer, int sourceNode) throws TransformerException {
    long[] list = null;
    XPathContext xctxt = transformer.getXPathContext();
    CountersTable ctable = transformer.getCountersTable();
    if (null != m_valueExpr) {
        XObject countObj = m_valueExpr.execute(xctxt, sourceNode, this);
        // According to Errata E24
        double d_count = java.lang.Math.floor(countObj.num() + 0.5);
        if (Double.isNaN(d_count))
            return "NaN";
        else if (d_count < 0 && Double.isInfinite(d_count))
            return "-Infinity";
        else if (Double.isInfinite(d_count))
            return "Infinity";
        else if (d_count == 0)
            return "0";
        else {
            long count = (long) d_count;
            list = new long[1];
            list[0] = count;
        }
    } else {
        if (Constants.NUMBERLEVEL_ANY == m_level) {
            list = new long[1];
            list[0] = ctable.countNode(xctxt, this, sourceNode);
        } else {
            NodeVector ancestors = getMatchingAncestors(xctxt, sourceNode, Constants.NUMBERLEVEL_SINGLE == m_level);
            int lastIndex = ancestors.size() - 1;
            if (lastIndex >= 0) {
                list = new long[lastIndex + 1];
                for (int i = lastIndex; i >= 0; i--) {
                    int target = ancestors.elementAt(i);
                    list[lastIndex - i] = ctable.countNode(xctxt, this, target);
                }
            }
        }
    }
    return (null != list) ? formatNumberList(transformer, list, sourceNode) : "";
}
Also used : NodeVector(org.apache.xml.utils.NodeVector) CountersTable(org.apache.xalan.transformer.CountersTable) XPathContext(org.apache.xpath.XPathContext) XObject(org.apache.xpath.objects.XObject)

Example 32 with XObject

use of org.apache.xpath.objects.XObject in project j2objc by google.

the class FuncDocument method execute.

/**
 * 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
 */
public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException {
    int context = xctxt.getCurrentNode();
    DTM dtm = xctxt.getDTM(context);
    int docContext = dtm.getDocumentRoot(context);
    XObject arg = (XObject) this.getArg0().execute(xctxt);
    String base = "";
    Expression arg1Expr = this.getArg1();
    if (null != arg1Expr) {
        // The URI reference may be relative. The base URI (see [3.2 Base URI])
        // of the node in the second argument node-set that is first in document
        // order is used as the base URI for resolving the
        // relative URI into an absolute URI.
        XObject arg2 = arg1Expr.execute(xctxt);
        if (XObject.CLASS_NODESET == arg2.getType()) {
            int baseNode = arg2.iter().nextNode();
            if (baseNode == DTM.NULL) {
                // See http://www.w3.org/1999/11/REC-xslt-19991116-errata#E14.
                // If the second argument is an empty nodeset, this is an error.
                // The processor can recover by returning an empty nodeset.
                warn(xctxt, XSLTErrorResources.WG_EMPTY_SECOND_ARG, null);
                XNodeSet nodes = new XNodeSet(xctxt.getDTMManager());
                return nodes;
            } else {
                DTM baseDTM = xctxt.getDTM(baseNode);
                base = baseDTM.getDocumentBaseURI();
            }
        // %REVIEW% This doesn't seem to be a problem with the conformance
        // suite, but maybe it's just not doing a good test?
        // int baseDoc = baseDTM.getDocument();
        // 
        // if (baseDoc == DTM.NULL /* || baseDoc instanceof Stylesheet  -->What to do?? */)
        // {
        // 
        // // base = ((Stylesheet)baseDoc).getBaseIdentifier();
        // base = xctxt.getNamespaceContext().getBaseIdentifier();
        // }
        // else
        // base = xctxt.getSourceTreeManager().findURIFromDoc(baseDoc);
        } else {
            // Can not convert other type to a node-set!;
            arg2.iter();
        }
    } else {
        // If the second argument is omitted, then it defaults to
        // the node in the stylesheet that contains the expression that
        // includes the call to the document function. Note that a
        // zero-length URI reference is a reference to the document
        // relative to which the URI reference is being resolved; thus
        // document("") refers to the root node of the stylesheet;
        // the tree representation of the stylesheet is exactly
        // the same as if the XML document containing the stylesheet
        // was the initial source document.
        assertion(null != xctxt.getNamespaceContext(), "Namespace context can not be null!");
        base = xctxt.getNamespaceContext().getBaseIdentifier();
    }
    XNodeSet nodes = new XNodeSet(xctxt.getDTMManager());
    NodeSetDTM mnl = nodes.mutableNodeset();
    DTMIterator iterator = (XObject.CLASS_NODESET == arg.getType()) ? arg.iter() : null;
    int pos = DTM.NULL;
    while ((null == iterator) || (DTM.NULL != (pos = iterator.nextNode()))) {
        XMLString ref = (null != iterator) ? xctxt.getDTM(pos).getStringValue(pos) : arg.xstr();
        // member.
        if (null == arg1Expr && DTM.NULL != pos) {
            DTM baseDTM = xctxt.getDTM(pos);
            base = baseDTM.getDocumentBaseURI();
        }
        if (null == ref)
            continue;
        if (DTM.NULL == docContext) {
            // "context does not have an owner document!");
            error(xctxt, XSLTErrorResources.ER_NO_CONTEXT_OWNERDOC, null);
        }
        // From http://www.ics.uci.edu/pub/ietf/uri/rfc1630.txt
        // A partial form can be distinguished from an absolute form in that the
        // latter must have a colon and that colon must occur before any slash
        // characters. Systems not requiring partial forms should not use any
        // unencoded slashes in their naming schemes.  If they do, absolute URIs
        // will still work, but confusion may result.
        int indexOfColon = ref.indexOf(':');
        int indexOfSlash = ref.indexOf('/');
        if ((indexOfColon != -1) && (indexOfSlash != -1) && (indexOfColon < indexOfSlash)) {
            // The url (or filename, for that matter) is absolute.
            base = null;
        }
        int newDoc = getDoc(xctxt, context, ref.toString(), base);
        // nodes.mutableNodeset().addNode(newDoc);
        if (DTM.NULL != newDoc) {
            // TODO: mnl.addNodeInDocOrder(newDoc, true, xctxt); ??
            if (!mnl.contains(newDoc)) {
                mnl.addElement(newDoc);
            }
        }
        if (null == iterator || newDoc == DTM.NULL)
            break;
    }
    return nodes;
}
Also used : NodeSetDTM(org.apache.xpath.NodeSetDTM) Expression(org.apache.xpath.Expression) XMLString(org.apache.xml.utils.XMLString) NodeSetDTM(org.apache.xpath.NodeSetDTM) DTM(org.apache.xml.dtm.DTM) XMLString(org.apache.xml.utils.XMLString) XObject(org.apache.xpath.objects.XObject) XNodeSet(org.apache.xpath.objects.XNodeSet) DTMIterator(org.apache.xml.dtm.DTMIterator)

Example 33 with XObject

use of org.apache.xpath.objects.XObject in project j2objc by google.

the class ElemCallTemplate method execute.

/**
 * Invoke a named template.
 * @see <a href="http://www.w3.org/TR/xslt#named-templates">named-templates in XSLT Specification</a>
 *
 * @param transformer non-null reference to the the current transform-time state.
 *
 * @throws TransformerException
 */
public void execute(TransformerImpl transformer) throws TransformerException {
    if (null != m_template) {
        XPathContext xctxt = transformer.getXPathContext();
        VariableStack vars = xctxt.getVarStack();
        int thisframe = vars.getStackFrame();
        int nextFrame = vars.link(m_template.m_frameSize);
        // so that the default param evaluation will work correctly.
        if (m_template.m_inArgsSize > 0) {
            vars.clearLocalSlots(0, m_template.m_inArgsSize);
            if (null != m_paramElems) {
                int currentNode = xctxt.getCurrentNode();
                vars.setStackFrame(thisframe);
                int size = m_paramElems.length;
                for (int i = 0; i < size; i++) {
                    ElemWithParam ewp = m_paramElems[i];
                    if (ewp.m_index >= 0) {
                        XObject obj = ewp.getValue(transformer, currentNode);
                        // Note here that the index for ElemWithParam must have been
                        // statically made relative to the xsl:template being called,
                        // NOT this xsl:template.
                        vars.setLocalVariable(ewp.m_index, obj, nextFrame);
                    }
                }
                vars.setStackFrame(nextFrame);
            }
        }
        SourceLocator savedLocator = xctxt.getSAXLocator();
        try {
            xctxt.setSAXLocator(m_template);
            // template.executeChildTemplates(transformer, sourceNode, mode, true);
            transformer.pushElemTemplateElement(m_template);
            m_template.execute(transformer);
        } finally {
            transformer.popElemTemplateElement();
            xctxt.setSAXLocator(savedLocator);
            // When we entered this function, the current
            // frame buffer (cfb) index in the variable stack may
            // have been manually set.  If we just call
            // unlink(), however, it will restore the cfb to the
            // previous link index from the link stack, rather than
            // the manually set cfb.  So,
            // the only safe solution is to restore it back
            // to the same position it was on entry, since we're
            // really not working in a stack context here. (Bug4218)
            vars.unlink(thisframe);
        }
    } else {
        transformer.getMsgMgr().error(this, XSLTErrorResources.ER_TEMPLATE_NOT_FOUND, // "Could not find template named: '"+templateName+"'");
        new Object[] { m_templateName });
    }
}
Also used : VariableStack(org.apache.xpath.VariableStack) SourceLocator(javax.xml.transform.SourceLocator) XPathContext(org.apache.xpath.XPathContext) XObject(org.apache.xpath.objects.XObject)

Example 34 with XObject

use of org.apache.xpath.objects.XObject in project j2objc by google.

the class ElemParam method execute.

/**
 * Execute a variable declaration and push it onto the variable stack.
 * @see <a href="http://www.w3.org/TR/xslt#variables">variables in XSLT Specification</a>
 *
 * @param transformer non-null reference to the the current transform-time state.
 *
 * @throws TransformerException
 */
public void execute(TransformerImpl transformer) throws TransformerException {
    VariableStack vars = transformer.getXPathContext().getVarStack();
    if (!vars.isLocalSet(m_index)) {
        int sourceNode = transformer.getXPathContext().getCurrentNode();
        XObject var = getValue(transformer, sourceNode);
        // transformer.getXPathContext().getVarStack().pushVariable(m_qname, var);
        transformer.getXPathContext().getVarStack().setLocalVariable(m_index, var);
    }
}
Also used : VariableStack(org.apache.xpath.VariableStack) XObject(org.apache.xpath.objects.XObject)

Example 35 with XObject

use of org.apache.xpath.objects.XObject in project j2objc by google.

the class StepPattern method getMatchScore.

/**
 * Get the match score of the given node.
 *
 * @param xctxt The XPath runtime context.
 * @param context The node to be tested.
 *
 * @return {@link org.apache.xpath.patterns.NodeTest#SCORE_NODETEST},
 *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NONE},
 *         {@link org.apache.xpath.patterns.NodeTest#SCORE_NSWILD},
 *         {@link org.apache.xpath.patterns.NodeTest#SCORE_QNAME}, or
 *         {@link org.apache.xpath.patterns.NodeTest#SCORE_OTHER}.
 *
 * @throws javax.xml.transform.TransformerException
 */
public double getMatchScore(XPathContext xctxt, int context) throws javax.xml.transform.TransformerException {
    xctxt.pushCurrentNode(context);
    xctxt.pushCurrentExpressionNode(context);
    try {
        XObject score = execute(xctxt);
        return score.num();
    } finally {
        xctxt.popCurrentNode();
        xctxt.popCurrentExpressionNode();
    }
// return XPath.MATCH_SCORE_NONE;
}
Also used : XObject(org.apache.xpath.objects.XObject)

Aggregations

XObject (org.apache.xpath.objects.XObject)107 TransformerException (javax.xml.transform.TransformerException)27 DTM (org.apache.xml.dtm.DTM)24 XPathContext (org.apache.xpath.XPathContext)24 XNodeSet (org.apache.xpath.objects.XNodeSet)15 DTMIterator (org.apache.xml.dtm.DTMIterator)12 VariableStack (org.apache.xpath.VariableStack)11 Vector (java.util.Vector)9 QName (org.apache.xml.utils.QName)9 Node (org.w3c.dom.Node)9 Expression (org.apache.xpath.Expression)8 XString (org.apache.xpath.objects.XString)7 DTMAxisTraverser (org.apache.xml.dtm.DTMAxisTraverser)6 XMLString (org.apache.xml.utils.XMLString)6 org.apache.xpath (org.apache.xpath)6 Document (org.w3c.dom.Document)6 ArrayList (java.util.ArrayList)5 NodeVector (org.apache.xml.utils.NodeVector)5 SAXException (org.xml.sax.SAXException)5 Hashtable (java.util.Hashtable)4