1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 */ 18 /* 19 * $Id: ChildIterator.java 468655 2006-10-28 07:12:06Z minchau $ 20 */ 21 package org.apache.xpath.axes; 22 23 import org.apache.xml.dtm.DTM; 24 import org.apache.xml.dtm.DTMFilter; 25 import org.apache.xpath.XPathContext; 26 import org.apache.xpath.compiler.Compiler; 27 28 /** 29 * This class implements an optimized iterator for 30 * "node()" patterns, that is, any children of the 31 * context node. 32 * @see org.apache.xpath.axes.LocPathIterator 33 * @xsl.usage advanced 34 */ 35 public class ChildIterator extends LocPathIterator 36 { 37 static final long serialVersionUID = -6935428015142993583L; 38 39 /** 40 * Create a ChildIterator object. 41 * 42 * @param compiler A reference to the Compiler that contains the op map. 43 * @param opPos The position within the op map, which contains the 44 * location path expression for this itterator. 45 * @param analysis Analysis bits of the entire pattern. 46 * 47 * @throws javax.xml.transform.TransformerException 48 */ 49 ChildIterator(Compiler compiler, int opPos, int analysis) 50 throws javax.xml.transform.TransformerException 51 { 52 super(compiler, opPos, analysis, false); 53 54 // This iterator matches all kinds of nodes 55 initNodeTest(DTMFilter.SHOW_ALL); 56 } 57 58 /** 59 * Return the first node out of the nodeset, if this expression is 60 * a nodeset expression. This is the default implementation for 61 * nodesets. 62 * <p>WARNING: Do not mutate this class from this function!</p> 63 * @param xctxt The XPath runtime context. 64 * @return the first node out of the nodeset, or DTM.NULL. 65 */ 66 public int asNode(XPathContext xctxt) 67 throws javax.xml.transform.TransformerException 68 { 69 int current = xctxt.getCurrentNode(); 70 71 DTM dtm = xctxt.getDTM(current); 72 73 return dtm.getFirstChild(current); 74 } 75 76 /** 77 * Returns the next node in the set and advances the position of the 78 * iterator in the set. After a NodeIterator is created, the first call 79 * to nextNode() returns the first node in the set. 80 * 81 * @return The next <code>Node</code> in the set being iterated over, or 82 * <code>null</code> if there are no more members in that set. 83 */ 84 public int nextNode() 85 { 86 if(m_foundLast) 87 return DTM.NULL; 88 89 int next; 90 91 m_lastFetched = next = (DTM.NULL == m_lastFetched) 92 ? m_cdtm.getFirstChild(m_context) 93 : m_cdtm.getNextSibling(m_lastFetched); 94 95 // m_lastFetched = next; 96 if (DTM.NULL != next) 97 { 98 m_pos++; 99 return next; 100 } 101 else 102 { 103 m_foundLast = true; 104 105 return DTM.NULL; 106 } 107 } 108 109 /** 110 * Returns the axis being iterated, if it is known. 111 * 112 * @return Axis.CHILD, etc., or -1 if the axis is not known or is of multiple 113 * types. 114 */ 115 public int getAxis() 116 { 117 return org.apache.xml.dtm.Axis.CHILD; 118 } 119 120 121 } 122