Search in sources :

Example 21 with XPathContext

use of org.apache.xpath.XPathContext in project j2objc by google.

the class OneStepIterator method getProximityPosition.

/**
   * Get the current sub-context position.  In order to do the
   * reverse axes count, for the moment this re-searches the axes
   * up to the predicate.  An optimization on this is to cache
   * the nodes searched, but, for the moment, this case is probably
   * rare enough that the added complexity isn't worth it.
   *
   * @param predicateIndex The predicate index of the proximity position.
   *
   * @return The pridicate index, or -1.
   */
protected int getProximityPosition(int predicateIndex) {
    if (!isReverseAxes())
        return super.getProximityPosition(predicateIndex);
    // -sb
    if (predicateIndex < 0)
        return -1;
    if (m_proximityPositions[predicateIndex] <= 0) {
        XPathContext xctxt = getXPathContext();
        try {
            OneStepIterator clone = (OneStepIterator) this.clone();
            int root = getRoot();
            xctxt.pushCurrentNode(root);
            clone.setRoot(root, xctxt);
            // clone.setPredicateCount(predicateIndex);
            clone.m_predCount = predicateIndex;
            // Count 'em all
            int count = 1;
            int next;
            while (DTM.NULL != (next = clone.nextNode())) {
                count++;
            }
            m_proximityPositions[predicateIndex] += count;
        } catch (CloneNotSupportedException cnse) {
        // can't happen
        } finally {
            xctxt.popCurrentNode();
        }
    }
    return m_proximityPositions[predicateIndex];
}
Also used : XPathContext(org.apache.xpath.XPathContext)

Example 22 with XPathContext

use of org.apache.xpath.XPathContext in project robovm by robovm.

the class ElemApplyTemplates method transformSelectedNodes.

/**
   * Perform a query if needed, and call transformNode for each child.
   *
   * @param transformer non-null reference to the the current transform-time state.
   *
   * @throws TransformerException Thrown in a variety of circumstances.
   * @xsl.usage advanced
   */
public void transformSelectedNodes(TransformerImpl transformer) throws TransformerException {
    final XPathContext xctxt = transformer.getXPathContext();
    final int sourceNode = xctxt.getCurrentNode();
    DTMIterator sourceNodes = m_selectExpression.asIterator(xctxt, sourceNode);
    VariableStack vars = xctxt.getVarStack();
    int nParams = getParamElemCount();
    int thisframe = vars.getStackFrame();
    boolean pushContextNodeListFlag = false;
    try {
        xctxt.pushCurrentNode(DTM.NULL);
        xctxt.pushCurrentExpressionNode(DTM.NULL);
        xctxt.pushSAXLocatorNull();
        transformer.pushElemTemplateElement(null);
        final Vector keys = (m_sortElems == null) ? null : transformer.processSortKeys(this, sourceNode);
        // Sort if we need to.
        if (null != keys)
            sourceNodes = sortNodes(xctxt, keys, sourceNodes);
        final SerializationHandler rth = transformer.getSerializationHandler();
        //      ContentHandler chandler = rth.getContentHandler();
        final StylesheetRoot sroot = transformer.getStylesheet();
        final TemplateList tl = sroot.getTemplateListComposed();
        final boolean quiet = transformer.getQuietConflictWarnings();
        // Should be able to get this from the iterator but there must be a bug.
        DTM dtm = xctxt.getDTM(sourceNode);
        int argsFrame = -1;
        if (nParams > 0) {
            // This code will create a section on the stack that is all the 
            // evaluated arguments.  These will be copied into the real params 
            // section of each called template.
            argsFrame = vars.link(nParams);
            vars.setStackFrame(thisframe);
            for (int i = 0; i < nParams; i++) {
                ElemWithParam ewp = m_paramElems[i];
                XObject obj = ewp.getValue(transformer, sourceNode);
                vars.setLocalVariable(i, obj, argsFrame);
            }
            vars.setStackFrame(argsFrame);
        }
        xctxt.pushContextNodeList(sourceNodes);
        pushContextNodeListFlag = true;
        IntStack currentNodes = xctxt.getCurrentNodeStack();
        IntStack currentExpressionNodes = xctxt.getCurrentExpressionNodeStack();
        // pushParams(transformer, xctxt);
        int child;
        while (DTM.NULL != (child = sourceNodes.nextNode())) {
            currentNodes.setTop(child);
            currentExpressionNodes.setTop(child);
            if (xctxt.getDTM(child) != dtm) {
                dtm = xctxt.getDTM(child);
            }
            final int exNodeType = dtm.getExpandedTypeID(child);
            final int nodeType = dtm.getNodeType(child);
            final QName mode = transformer.getMode();
            ElemTemplate template = tl.getTemplateFast(xctxt, child, exNodeType, mode, -1, quiet, dtm);
            // See http://www.w3.org/TR/xslt#built-in-rule.
            if (null == template) {
                switch(nodeType) {
                    case DTM.DOCUMENT_FRAGMENT_NODE:
                    case DTM.ELEMENT_NODE:
                        template = sroot.getDefaultRule();
                        // %OPT% direct faster?
                        break;
                    case DTM.ATTRIBUTE_NODE:
                    case DTM.CDATA_SECTION_NODE:
                    case DTM.TEXT_NODE:
                        // if(rth.m_elemIsPending || rth.m_docPending)
                        //  rth.flushPending(true);
                        transformer.pushPairCurrentMatched(sroot.getDefaultTextRule(), child);
                        transformer.setCurrentElement(sroot.getDefaultTextRule());
                        // dtm.dispatchCharactersEvents(child, chandler, false);
                        dtm.dispatchCharactersEvents(child, rth, false);
                        transformer.popCurrentMatched();
                        continue;
                    case DTM.DOCUMENT_NODE:
                        template = sroot.getDefaultRootRule();
                        break;
                    default:
                        // No default rules for processing instructions and the like.
                        continue;
                }
            } else {
                transformer.setCurrentElement(template);
            }
            transformer.pushPairCurrentMatched(template, child);
            // See comment with unlink, below
            int currentFrameBottom;
            if (template.m_frameSize > 0) {
                xctxt.pushRTFContext();
                // See comment with unlink, below
                currentFrameBottom = vars.getStackFrame();
                vars.link(template.m_frameSize);
                // xsl:params might not be nulled.
                if (/* nParams > 0 && */
                template.m_inArgsSize > 0) {
                    int paramIndex = 0;
                    for (ElemTemplateElement elem = template.getFirstChildElem(); null != elem; elem = elem.getNextSiblingElem()) {
                        if (Constants.ELEMNAME_PARAMVARIABLE == elem.getXSLToken()) {
                            ElemParam ep = (ElemParam) elem;
                            int i;
                            for (i = 0; i < nParams; i++) {
                                ElemWithParam ewp = m_paramElems[i];
                                if (ewp.m_qnameID == ep.m_qnameID) {
                                    XObject obj = vars.getLocalVariable(i, argsFrame);
                                    vars.setLocalVariable(paramIndex, obj);
                                    break;
                                }
                            }
                            if (i == nParams)
                                vars.setLocalVariable(paramIndex, null);
                        } else
                            break;
                        paramIndex++;
                    }
                }
            } else
                currentFrameBottom = 0;
            // each of them.
            for (ElemTemplateElement t = template.m_firstChild; t != null; t = t.m_nextSibling) {
                xctxt.setSAXLocator(t);
                try {
                    transformer.pushElemTemplateElement(t);
                    t.execute(transformer);
                } finally {
                    transformer.popElemTemplateElement();
                }
            }
            if (template.m_frameSize > 0) {
                // See Frank Weiss bug around 03/19/2002 (no Bugzilla report yet).
                // While unlink will restore to the proper place, the real position 
                // may have been changed for xsl:with-param, so that variables 
                // can be accessed.  
                // of right now.
                // More:
                // 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(currentFrameBottom);
                xctxt.popRTFContext();
            }
            transformer.popCurrentMatched();
        }
    // end while (DTM.NULL != (child = sourceNodes.nextNode()))
    } catch (SAXException se) {
        transformer.getErrorListener().fatalError(new TransformerException(se));
    } finally {
        // Unlink to the original stack frame
        if (nParams > 0)
            vars.unlink(thisframe);
        xctxt.popSAXLocator();
        if (pushContextNodeListFlag)
            xctxt.popContextNodeList();
        transformer.popElemTemplateElement();
        xctxt.popCurrentExpressionNode();
        xctxt.popCurrentNode();
        sourceNodes.detach();
    }
}
Also used : VariableStack(org.apache.xpath.VariableStack) IntStack(org.apache.xml.utils.IntStack) QName(org.apache.xml.utils.QName) SerializationHandler(org.apache.xml.serializer.SerializationHandler) DTMIterator(org.apache.xml.dtm.DTMIterator) SAXException(org.xml.sax.SAXException) XPathContext(org.apache.xpath.XPathContext) DTM(org.apache.xml.dtm.DTM) Vector(java.util.Vector) XObject(org.apache.xpath.objects.XObject) TransformerException(javax.xml.transform.TransformerException)

Example 23 with XPathContext

use of org.apache.xpath.XPathContext in project robovm by robovm.

the class ElemChoose method execute.

/**
   * Execute the xsl:choose transformation.
   *
   *
   * @param transformer non-null reference to the the current transform-time state.
   *
   * @throws TransformerException
   */
public void execute(TransformerImpl transformer) throws TransformerException {
    boolean found = false;
    for (ElemTemplateElement childElem = getFirstChildElem(); childElem != null; childElem = childElem.getNextSiblingElem()) {
        int type = childElem.getXSLToken();
        if (Constants.ELEMNAME_WHEN == type) {
            found = true;
            ElemWhen when = (ElemWhen) childElem;
            // must be xsl:when
            XPathContext xctxt = transformer.getXPathContext();
            int sourceNode = xctxt.getCurrentNode();
            if (when.getTest().bool(xctxt, sourceNode, when)) {
                transformer.executeChildTemplates(when, true);
                return;
            }
        } else if (Constants.ELEMNAME_OTHERWISE == type) {
            found = true;
            // xsl:otherwise
            transformer.executeChildTemplates(childElem, true);
            return;
        }
    }
    if (!found)
        transformer.getMsgMgr().error(this, XSLTErrorResources.ER_CHOOSE_REQUIRES_WHEN);
}
Also used : XPathContext(org.apache.xpath.XPathContext)

Example 24 with XPathContext

use of org.apache.xpath.XPathContext in project robovm by robovm.

the class ElemCopy method execute.

/**
   * The xsl:copy element provides an easy way of copying the current node.
   * Executing this function creates a copy of the current node into the
   * result tree.
   * <p>The namespace nodes of the current node are automatically
   * copied as well, but the attributes and children of the node are not
   * automatically copied. The content of the xsl:copy element is a
   * template for the attributes and children of the created node;
   * the content is instantiated only for nodes of types that can have
   * attributes or children (i.e. root nodes and element nodes).</p>
   * <p>The root node is treated specially because the root node of the
   * result tree is created implicitly. When the current node is the
   * root node, xsl:copy will not create a root node, but will just use
   * the content template.</p>
   *
   * @param transformer non-null reference to the the current transform-time state.
   *
   * @throws TransformerException
   */
public void execute(TransformerImpl transformer) throws TransformerException {
    XPathContext xctxt = transformer.getXPathContext();
    try {
        int sourceNode = xctxt.getCurrentNode();
        xctxt.pushCurrentNode(sourceNode);
        DTM dtm = xctxt.getDTM(sourceNode);
        short nodeType = dtm.getNodeType(sourceNode);
        if ((DTM.DOCUMENT_NODE != nodeType) && (DTM.DOCUMENT_FRAGMENT_NODE != nodeType)) {
            SerializationHandler rthandler = transformer.getSerializationHandler();
            // TODO: Process the use-attribute-sets stuff
            ClonerToResultTree.cloneToResultTree(sourceNode, nodeType, dtm, rthandler, false);
            if (DTM.ELEMENT_NODE == nodeType) {
                super.execute(transformer);
                SerializerUtils.processNSDecls(rthandler, sourceNode, nodeType, dtm);
                transformer.executeChildTemplates(this, true);
                String ns = dtm.getNamespaceURI(sourceNode);
                String localName = dtm.getLocalName(sourceNode);
                transformer.getResultTreeHandler().endElement(ns, localName, dtm.getNodeName(sourceNode));
            }
        } else {
            super.execute(transformer);
            transformer.executeChildTemplates(this, true);
        }
    } catch (org.xml.sax.SAXException se) {
        throw new TransformerException(se);
    } finally {
        xctxt.popCurrentNode();
    }
}
Also used : SerializationHandler(org.apache.xml.serializer.SerializationHandler) XPathContext(org.apache.xpath.XPathContext) DTM(org.apache.xml.dtm.DTM) TransformerException(javax.xml.transform.TransformerException)

Example 25 with XPathContext

use of org.apache.xpath.XPathContext in project robovm by robovm.

the class ElemCopyOf method execute.

/**
   * The xsl:copy-of element can be used to insert a result tree
   * fragment into the result tree, without first converting it to
   * a string as xsl:value-of does (see [7.6.1 Generating Text with
   * xsl:value-of]).
   *
   * @param transformer non-null reference to the the current transform-time state.
   *
   * @throws TransformerException
   */
public void execute(TransformerImpl transformer) throws TransformerException {
    try {
        XPathContext xctxt = transformer.getXPathContext();
        int sourceNode = xctxt.getCurrentNode();
        XObject value = m_selectExpression.execute(xctxt, sourceNode, this);
        SerializationHandler handler = transformer.getSerializationHandler();
        if (null != value) {
            int type = value.getType();
            String s;
            switch(type) {
                case XObject.CLASS_BOOLEAN:
                case XObject.CLASS_NUMBER:
                case XObject.CLASS_STRING:
                    s = value.str();
                    handler.characters(s.toCharArray(), 0, s.length());
                    break;
                case XObject.CLASS_NODESET:
                    // System.out.println(value);
                    DTMIterator nl = value.iter();
                    // Copy the tree.
                    DTMTreeWalker tw = new TreeWalker2Result(transformer, handler);
                    int pos;
                    while (DTM.NULL != (pos = nl.nextNode())) {
                        DTM dtm = xctxt.getDTMManager().getDTM(pos);
                        short t = dtm.getNodeType(pos);
                        // generated, so we need to only walk the child nodes.
                        if (t == DTM.DOCUMENT_NODE) {
                            for (int child = dtm.getFirstChild(pos); child != DTM.NULL; child = dtm.getNextSibling(child)) {
                                tw.traverse(child);
                            }
                        } else if (t == DTM.ATTRIBUTE_NODE) {
                            SerializerUtils.addAttribute(handler, pos);
                        } else {
                            tw.traverse(pos);
                        }
                    }
                    // nl.detach();
                    break;
                case XObject.CLASS_RTREEFRAG:
                    SerializerUtils.outputResultTreeFragment(handler, value, transformer.getXPathContext());
                    break;
                default:
                    s = value.str();
                    handler.characters(s.toCharArray(), 0, s.length());
                    break;
            }
        }
    // I don't think we want this.  -sb
    //  if (transformer.getDebug())
    //  transformer.getTraceManager().fireSelectedEvent(sourceNode, this,
    //  "endSelect", m_selectExpression, value);
    } catch (org.xml.sax.SAXException se) {
        throw new TransformerException(se);
    }
}
Also used : SerializationHandler(org.apache.xml.serializer.SerializationHandler) TreeWalker2Result(org.apache.xalan.transformer.TreeWalker2Result) DTMTreeWalker(org.apache.xml.dtm.ref.DTMTreeWalker) DTMIterator(org.apache.xml.dtm.DTMIterator) XPathContext(org.apache.xpath.XPathContext) DTM(org.apache.xml.dtm.DTM) XObject(org.apache.xpath.objects.XObject) TransformerException(javax.xml.transform.TransformerException)

Aggregations

XPathContext (org.apache.xpath.XPathContext)73 TransformerException (javax.xml.transform.TransformerException)30 XObject (org.apache.xpath.objects.XObject)29 DTM (org.apache.xml.dtm.DTM)16 SAXException (org.xml.sax.SAXException)16 SerializationHandler (org.apache.xml.serializer.SerializationHandler)14 DTMIterator (org.apache.xml.dtm.DTMIterator)12 Vector (java.util.Vector)10 VariableStack (org.apache.xpath.VariableStack)8 NodeVector (org.apache.xml.utils.NodeVector)6 QName (org.apache.xml.utils.QName)6 ElemTemplateElement (org.apache.xalan.templates.ElemTemplateElement)4 StylesheetRoot (org.apache.xalan.templates.StylesheetRoot)4 IntStack (org.apache.xml.utils.IntStack)4 Expression (org.apache.xpath.Expression)4 XNodeSet (org.apache.xpath.objects.XNodeSet)4 XRTreeFrag (org.apache.xpath.objects.XRTreeFrag)4 Node (org.w3c.dom.Node)3 IOException (java.io.IOException)2 Hashtable (java.util.Hashtable)2