/** * Test whether a specified node is visible in the logical view of a TreeWalker or NodeIterator. * This function will be called by the implementation of TreeWalker and NodeIterator; it is not * intended to be called directly from user code. * * @param n The node to check to see if it passes the filter or not. * @return a constant to determine whether the node is accepted, rejected, or skipped, as defined * above . */ public short acceptNode(int n, XPathContext xctxt) { try { xctxt.pushCurrentNode(n); xctxt.pushIteratorRoot(m_context); if (DEBUG) { System.out.println("traverser: " + m_traverser); System.out.print("node: " + n); System.out.println(", " + m_cdtm.getNodeName(n)); // if(m_cdtm.getNodeName(n).equals("near-east")) System.out.println("pattern: " + m_pattern.toString()); m_pattern.debugWhatToShow(m_pattern.getWhatToShow()); } XObject score = m_pattern.execute(xctxt); if (DEBUG) { // System.out.println("analysis: "+Integer.toBinaryString(m_analysis)); System.out.println("score: " + score); System.out.println("skip: " + (score == NodeTest.SCORE_NONE)); } // System.out.println("\n::acceptNode - score: "+score.num()+"::"); return (score == NodeTest.SCORE_NONE) ? DTMIterator.FILTER_SKIP : DTMIterator.FILTER_ACCEPT; } catch (javax.xml.transform.TransformerException se) { // TODO: Fix this. throw new RuntimeException(se.getMessage()); } finally { xctxt.popCurrentNode(); xctxt.popIteratorRoot(); } }
/** * Returns the next node in the set and advances the position of the iterator in the set. After a * NodeIterator is created, the first call to nextNode() returns the first node in the set. * * @return The next <code>Node</code> in the set being iterated over, or <code>null</code> if * there are no more members in that set. */ public int nextNode() { if (m_foundLast) return DTM.NULL; int next; com.sun.org.apache.xpath.internal.VariableStack vars; int savedStart; if (-1 != m_stackFrame) { vars = m_execContext.getVarStack(); // These three statements need to be combined into one operation. savedStart = vars.getStackFrame(); vars.setStackFrame(m_stackFrame); } else { // Yuck. Just to shut up the compiler! vars = null; savedStart = 0; } try { if (DEBUG) System.out.println("m_pattern" + m_pattern.toString()); do { next = getNextNode(); if (DTM.NULL != next) { if (DTMIterator.FILTER_ACCEPT == acceptNode(next, m_execContext)) break; else continue; } else break; } while (next != DTM.NULL); if (DTM.NULL != next) { if (DEBUG) { System.out.println("next: " + next); System.out.println("name: " + m_cdtm.getNodeName(next)); } incrementCurrentPos(); return next; } else { m_foundLast = true; return DTM.NULL; } } finally { if (-1 != m_stackFrame) { // These two statements need to be combined into one operation. vars.setStackFrame(savedStart); } } }