19f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/* 29f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one 39f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or more contributor license agreements. See the NOTICE file 49f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed with this work for additional information 59f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * regarding copyright ownership. The ASF licenses this file 69f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to you under the Apache License, Version 2.0 (the "License"); 79f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * you may not use this file except in compliance with the License. 89f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * You may obtain a copy of the License at 99f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unless required by applicable law or agreed to in writing, software 139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * See the License for the specific language governing permissions and 169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * limitations under the License. 179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/* 199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * $Id: ElemTemplateElement.java 475981 2006-11-16 23:35:53Z minchau $ 209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xalan.templates; 229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.io.Serializable; 249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.ArrayList; 259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.Enumeration; 269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport java.util.List; 279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.SourceLocator; 299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.TransformerException; 309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.res.XSLMessages; 329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.res.XSLTErrorResources; 339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.transformer.TransformerImpl; 349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.SerializationHandler; 359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.PrefixResolver; 369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.UnImplNode; 379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.ExpressionNode; 389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.WhitespaceStrippingElementMatcher; 399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.DOMException; 419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Document; 429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.Node; 439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.w3c.dom.NodeList; 449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.helpers.NamespaceSupport; 469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/** 489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * An instance of this class represents an element inside 499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * an xsl:template class. It has a single "execute" method 509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * which is expected to perform the given action on the 519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * result tree. 529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This class acts like a Element node, and implements the 539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Element interface, but is not a full implementation 549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * of that interface... it only implements enough for 559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * basic traversal of the tree. 569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see Stylesheet 589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced 599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class ElemTemplateElement extends UnImplNode 619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson implements PrefixResolver, Serializable, ExpressionNode, 629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson WhitespaceStrippingElementMatcher, XSLTVisitable 639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{ 649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson static final long serialVersionUID = 4440018597841834447L; 659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Construct a template element instance. 689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ElemTemplateElement(){} 719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Tell if this template is a compiled template. 749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return Boolean flag indicating whether this is a compiled template 769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean isCompiledTemplate() 789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get an integer representation of the element type. 849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return An integer representation of the element, defined in the 869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Constants class. 879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see org.apache.xalan.templates.Constants 889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getXSLToken() 909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return Constants.ELEMNAME_UNDEFINED; 929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Return the node name. 969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return An invalid node name 989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String getNodeName() 1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return "Unknown XSLT Element"; 1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * For now, just return the result of getNodeName(), which 1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the local name. 1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The result of getNodeName(). 1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String getLocalName() 1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return getNodeName(); 1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This function will be called on top-level elements 1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * only, just before the transform begins. 1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param transformer The XSLT TransformerFactory. 1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void runtimeInit(TransformerImpl transformer) throws TransformerException{} 1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Execute the element's primary function. Subclasses of this 1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * function may recursivly execute down the element tree. 1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param transformer The XSLT TransformerFactory. 1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException if any checked exception occurs. 1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void execute( 1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson TransformerImpl transformer) 1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws TransformerException{} 1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the owning "composed" stylesheet. This looks up the 1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * inheritance chain until it calls getStylesheetComposed 1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * on a Stylesheet object, which will Get the owning 1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * aggregated stylesheet, or that stylesheet if it is aggregated. 1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the owning "composed" stylesheet. 1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public StylesheetComposed getStylesheetComposed() 1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_parentNode.getStylesheetComposed(); 1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the owning stylesheet. This looks up the 1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * inheritance chain until it calls getStylesheet 1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * on a Stylesheet object, which will return itself. 1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the owning stylesheet 1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Stylesheet getStylesheet() 1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (null==m_parentNode) ? null : m_parentNode.getStylesheet(); 1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the owning root stylesheet. This looks up the 1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * inheritance chain until it calls StylesheetRoot 1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * on a Stylesheet object, which will return a reference 1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to the root stylesheet. 1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the owning root stylesheet 1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public StylesheetRoot getStylesheetRoot() 1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_parentNode.getStylesheetRoot(); 1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This function is called during recomposition to 1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * control how this element is composed. 1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void recompose(StylesheetRoot root) throws TransformerException 1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This function is called after everything else has been 1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * recomposed, and allows the template to set remaining 1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * values that may be based on some other property that 1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * depends on recomposition. 1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void compose(StylesheetRoot sroot) throws TransformerException 1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson resolvePrefixTables(); 1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement t = getFirstChildElem(); 1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_hasTextLitOnly = ((t != null) 1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson && (t.getXSLToken() == Constants.ELEMNAME_TEXTLITERALRESULT) 1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson && (t.getNextSiblingElem() == null)); 1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson StylesheetRoot.ComposeState cstate = sroot.getComposeState(); 2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson cstate.pushStackMark(); 2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This after the template's children have been composed. 2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void endCompose(StylesheetRoot sroot) throws TransformerException 2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson StylesheetRoot.ComposeState cstate = sroot.getComposeState(); 2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson cstate.popStackMark(); 2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Throw a template element runtime error. (Note: should we throw a TransformerException instead?) 2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param msg key of the error that occured. 2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param args Arguments to be used in the message 2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void error(String msg, Object[] args) 2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String themsg = XSLMessages.createMessage(msg, args); 2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new RuntimeException(XSLMessages.createMessage( 2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XSLTErrorResources.ER_ELEMTEMPLATEELEM_ERR, 2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson new Object[]{ themsg })); 2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /* 2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Throw an error. 2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param msg Message key for the error 2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void error(String msg) 2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson error(msg, null); 2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Implemented DOM Element methods. 2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Add a child to the child list. 2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * NOTE: This presumes the child did not previously have a parent. 2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Making that assumption makes this a less expensive operation -- but 2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * requires that if you *do* want to reparent a node, you use removeChild() 2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * first to remove it from its previous context. Failing to do so will 2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * damage the tree. 2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param newChild Child to be added to child list 2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return Child just added to the child list 2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws DOMException 2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Node appendChild(Node newChild) throws DOMException 2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == newChild) 2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson error(XSLTErrorResources.ER_NULL_CHILD, null); //"Trying to add a null child!"); 2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement elem = (ElemTemplateElement) newChild; 2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == m_firstChild) 2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_firstChild = elem; 2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement last = (ElemTemplateElement) getLastChild(); 2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson last.m_nextSibling = elem; 2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson elem.m_parentNode = this; 2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return newChild; 2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Add a child to the child list. 2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * NOTE: This presumes the child did not previously have a parent. 2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Making that assumption makes this a less expensive operation -- but 2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * requires that if you *do* want to reparent a node, you use removeChild() 2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * first to remove it from its previous context. Failing to do so will 2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * damage the tree. 2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param elem Child to be added to child list 2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return Child just added to the child list 2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ElemTemplateElement appendChild(ElemTemplateElement elem) 2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == elem) 2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson error(XSLTErrorResources.ER_NULL_CHILD, null); //"Trying to add a null child!"); 2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == m_firstChild) 3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_firstChild = elem; 3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement last = getLastChildElem(); 3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson last.m_nextSibling = elem; 3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson elem.setParentElem(this); 3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return elem; 3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Tell if there are child nodes. 3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return True if there are child nodes 3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean hasChildNodes() 3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (null != m_firstChild); 3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the type of the node. 3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return Constant for this node type 3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public short getNodeType() 3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return org.w3c.dom.Node.ELEMENT_NODE; 3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Return the nodelist (same reference). 3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The nodelist containing the child nodes (this) 3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public NodeList getChildNodes() 3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return this; 3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Remove a child. 3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * ADDED 9/8/200 to support compilation. 3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * TODO: ***** Alternative is "removeMe() from my parent if any" 3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * ... which is less well checked, but more convenient in some cases. 3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Given that we assume only experts are calling this class, it might 3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * be preferable. It's less DOMish, though. 3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param childETE The child to remove. This operation is a no-op 3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * if oldChild is not a child of this node. 3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return the removed child, or null if the specified 3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * node was not a child of this element. 3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ElemTemplateElement removeChild(ElemTemplateElement childETE) 3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (childETE == null || childETE.m_parentNode != this) 3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return null; 3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Pointers to the child 3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (childETE == m_firstChild) 3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_firstChild = childETE.m_nextSibling; 3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement prev = childETE.getPreviousSiblingElem(); 3739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson prev.m_nextSibling = childETE.m_nextSibling; 3759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Pointers from the child 3789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson childETE.m_parentNode = null; 3799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson childETE.m_nextSibling = null; 3809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return childETE; 3829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 3839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 3859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Replace the old child with a new child. 3869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param newChild New child to replace with 3889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param oldChild Old child to be replaced 3899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The new child 3919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 3929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws DOMException 3939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 3949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Node replaceChild(Node newChild, Node oldChild) throws DOMException 3959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 3969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 3979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (oldChild == null || oldChild.getParentNode() != this) 3989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return null; 3999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement newChildElem = ((ElemTemplateElement) newChild); 4019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement oldChildElem = ((ElemTemplateElement) oldChild); 4029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Fix up previous sibling. 4049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement prev = 4059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson (ElemTemplateElement) oldChildElem.getPreviousSibling(); 4069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != prev) 4089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson prev.m_nextSibling = newChildElem; 4099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Fix up parent (this) 4119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_firstChild == oldChildElem) 4129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_firstChild = newChildElem; 4139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson newChildElem.m_parentNode = this; 4159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson oldChildElem.m_parentNode = null; 4169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson newChildElem.m_nextSibling = oldChildElem.m_nextSibling; 4179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson oldChildElem.m_nextSibling = null; 4189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // newChildElem.m_stylesheet = oldChildElem.m_stylesheet; 4209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // oldChildElem.m_stylesheet = null; 4219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return newChildElem; 4229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Unimplemented. See org.w3c.dom.Node 4269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param newChild New child node to insert 4289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param refChild Insert in front of this child 4299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return null 4319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws DOMException 4339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 4349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Node insertBefore(Node newChild, Node refChild) throws DOMException 4359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(null == refChild) 4379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson appendChild(newChild); 4399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return newChild; 4409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(newChild == refChild) 4439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // hmm... 4459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return newChild; 4469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Node node = m_firstChild; 4499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Node prev = null; 4509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean foundit = false; 4519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (null != node) 4539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // If the newChild is already in the tree, it is first removed. 4559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(newChild == node) 4569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(null != prev) 4589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ((ElemTemplateElement)prev).m_nextSibling = 4599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson (ElemTemplateElement)node.getNextSibling(); 4609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 4619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_firstChild = (ElemTemplateElement)node.getNextSibling(); 4629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson node = node.getNextSibling(); 4639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson continue; // prev remains the same. 4649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(refChild == node) 4669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(null != prev) 4689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ((ElemTemplateElement)prev).m_nextSibling = (ElemTemplateElement)newChild; 4709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 4729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 4739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_firstChild = (ElemTemplateElement)newChild; 4749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ((ElemTemplateElement)newChild).m_nextSibling = (ElemTemplateElement)refChild; 4769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ((ElemTemplateElement)newChild).setParentElem(this); 4779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson prev = newChild; 4789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson node = node.getNextSibling(); 4799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson foundit = true; 4809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson continue; 4819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson prev = node; 4839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson node = node.getNextSibling(); 4849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(!foundit) 4879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new DOMException(DOMException.NOT_FOUND_ERR, 4889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson "refChild was not found in insertBefore method!"); 4899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 4909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return newChild; 4919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 4929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 4949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 4959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Replace the old child with a new child. 4969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 4979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param newChildElem New child to replace with 4989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param oldChildElem Old child to be replaced 4999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The new child 5019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws DOMException 5039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ElemTemplateElement replaceChild(ElemTemplateElement newChildElem, 5059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement oldChildElem) 5069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (oldChildElem == null || oldChildElem.getParentElem() != this) 5099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return null; 5109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Fix up previous sibling. 5129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement prev = 5139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson oldChildElem.getPreviousSiblingElem(); 5149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != prev) 5169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson prev.m_nextSibling = newChildElem; 5179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Fix up parent (this) 5199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (m_firstChild == oldChildElem) 5209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_firstChild = newChildElem; 5219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson newChildElem.m_parentNode = this; 5239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson oldChildElem.m_parentNode = null; 5249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson newChildElem.m_nextSibling = oldChildElem.m_nextSibling; 5259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson oldChildElem.m_nextSibling = null; 5269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // newChildElem.m_stylesheet = oldChildElem.m_stylesheet; 5289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // oldChildElem.m_stylesheet = null; 5299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return newChildElem; 5309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 5339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * NodeList method: Count the immediate children of this node 5349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The count of children of this node 5369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getLength() 5389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // It is assumed that the getChildNodes call synchronized 5419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // the children. Therefore, we can access the first child 5429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // reference directly. 5439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int count = 0; 5449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (ElemTemplateElement node = m_firstChild; node != null; 5469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson node = node.m_nextSibling) 5479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson count++; 5499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return count; 5529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } // getLength():int 5539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 5559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * NodeList method: Return the Nth immediate child of this node, or 5569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * null if the index is out of bounds. 5579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param index Index of child to find 5599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return org.w3c.dom.Node: the child node at given index 5609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Node item(int index) 5629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // It is assumed that the getChildNodes call synchronized 5659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // the children. Therefore, we can access the first child 5669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // reference directly. 5679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement node = m_firstChild; 5689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < index && node != null; i++) 5709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson node = node.m_nextSibling; 5729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return node; 5759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } // item(int):Node 5769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 5789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the stylesheet owner. 5799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The stylesheet owner 5819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Document getOwnerDocument() 5839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return getStylesheet(); 5859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 5869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 5879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 5889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the owning xsl:template element. 5899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 5909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The owning xsl:template element, this element if it is a xsl:template, or null if not found. 5919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 5929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ElemTemplate getOwnerXSLTemplate() 5939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement el = this; 5959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int type = el.getXSLToken(); 5969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while((null != el) && (type != Constants.ELEMNAME_TEMPLATE)) 5979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 5989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson el = el.getParentElem(); 5999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(null != el) 6009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson type = el.getXSLToken(); 6019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (ElemTemplate)el; 6039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Return the element name. 6089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The element name 6109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String getTagName() 6129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return getNodeName(); 6149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Tell if this element only has one text child, for optimization purposes. 6189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return true of this element only has one text literal child. 6199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean hasTextLitOnly() 6219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_hasTextLitOnly; 6239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Return the base identifier. 6279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 6289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The base identifier 6299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String getBaseIdentifier() 6319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Should this always be absolute? 6349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return this.getSystemId(); 6359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** line number where the current document event ends. 6389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial */ 6399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private int m_lineNumber; 6409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** line number where the current document event ends. 6429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial */ 6439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private int m_endLineNumber; 6449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Return the line number where the current document event ends. 6479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Note that this is the line position of the first character 6489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * after the text associated with the document event. 6499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The line number, or -1 if none is available. 6509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see #getColumnNumber 6519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getEndLineNumber() 6539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_endLineNumber; 6559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Return the line number where the current document event ends. 6599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Note that this is the line position of the first character 6609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * after the text associated with the document event. 6619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The line number, or -1 if none is available. 6629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see #getColumnNumber 6639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getLineNumber() 6659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_lineNumber; 6679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** the column number where the current document event ends. 6709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial */ 6719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private int m_columnNumber; 6729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** the column number where the current document event ends. 6749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial */ 6759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private int m_endColumnNumber; 6769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Return the column number where the current document event ends. 6799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Note that this is the column number of the first 6809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * character after the text associated with the document 6819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * event. The first column in a line is position 1. 6829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The column number, or -1 if none is available. 6839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see #getLineNumber 6849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getEndColumnNumber() 6869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 6879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_endColumnNumber; 6889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 6899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 6909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 6919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Return the column number where the current document event ends. 6929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Note that this is the column number of the first 6939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * character after the text associated with the document 6949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * event. The first column in a line is position 1. 6959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The column number, or -1 if none is available. 6969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see #getLineNumber 6979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 6989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getColumnNumber() 6999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_columnNumber; 7019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Return the public identifier for the current document event. 7059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>This will be the public identifier 7069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return A string containing the public identifier, or 7079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * null if none is available. 7089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see #getSystemId 7099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String getPublicId() 7119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (null != m_parentNode) ? m_parentNode.getPublicId() : null; 7139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Return the system identifier for the current document event. 7179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <p>If the system identifier is a URL, the parser must resolve it 7199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * fully before passing it to the application.</p> 7209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return A string containing the system identifier, or null 7229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * if none is available. 7239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see #getPublicId 7249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String getSystemId() 7269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Stylesheet sheet=getStylesheet(); 7289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (sheet==null) ? null : sheet.getHref(); 7299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Set the location information for this element. 7339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param locator Source Locator with location information for this element 7359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setLocaterInfo(SourceLocator locator) 7379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_lineNumber = locator.getLineNumber(); 7399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_columnNumber = locator.getColumnNumber(); 7409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Set the end location information for this element. 7449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param locator Source Locator with location information for this element 7469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setEndLocaterInfo(SourceLocator locator) 7489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_endLineNumber = locator.getLineNumber(); 7509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_endColumnNumber = locator.getColumnNumber(); 7519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Tell if this element has the default space handling 7559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * turned off or on according to the xml:space attribute. 7569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 7579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private boolean m_defaultSpace = true; 7599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Tell if this element only has one text child, for optimization purposes. 7629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 7639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private boolean m_hasTextLitOnly = false; 7659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Tell if this element only has one text child, for optimization purposes. 7689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 7699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected boolean m_hasVariableDecl = false; 7719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean hasVariableDecl() 7739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_hasVariableDecl; 7759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Set the "xml:space" attribute. 7799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * A text node is preserved if an ancestor element of the text node 7809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * has an xml:space attribute with a value of preserve, and 7819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * no closer ancestor element has xml:space with a value of default. 7829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#strip">strip in XSLT Specification</a> 7839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#section-Creating-Text">section-Creating-Text in XSLT Specification</a> 7849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 7859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param v Enumerated value, either Constants.ATTRVAL_PRESERVE 7869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * or Constants.ATTRVAL_STRIP. 7879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 7889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setXmlSpace(int v) 7899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 7909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_defaultSpace = ((Constants.ATTRVAL_STRIP == v) ? true : false); 7919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 7929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 7939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 7949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the "xml:space" attribute. 7959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * A text node is preserved if an ancestor element of the text node 7969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * has an xml:space attribute with a value of preserve, and 7979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * no closer ancestor element has xml:space with a value of default. 7989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#strip">strip in XSLT Specification</a> 7999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#section-Creating-Text">section-Creating-Text in XSLT Specification</a> 8009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The value of the xml:space attribute 8029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 8039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean getXmlSpace() 8049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_defaultSpace; 8069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 8099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The list of namespace declarations for this element only. 8109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 8119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 8129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private List m_declaredPrefixes; 8139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 8159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Return a table that contains all prefixes available 8169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * within this element context. 8179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return Vector containing the prefixes available within this 8199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * element context 8209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 8219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public List getDeclaredPrefixes() 8229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_declaredPrefixes; 8249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 8279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * From the SAX2 helper class, set the namespace table for 8289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * this element. Take care to call resolveInheritedNamespaceDecls. 8299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * after all namespace declarations have been added. 8309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param nsSupport non-null reference to NamespaceSupport from 8329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the ContentHandler. 8339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 8359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 8369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setPrefixes(NamespaceSupport nsSupport) throws TransformerException 8379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson setPrefixes(nsSupport, false); 8399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 8429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Copy the namespace declarations from the NamespaceSupport object. 8439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Take care to call resolveInheritedNamespaceDecls. 8449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * after all namespace declarations have been added. 8459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param nsSupport non-null reference to NamespaceSupport from 8479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the ContentHandler. 8489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param excludeXSLDecl true if XSLT namespaces should be ignored. 8499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 8519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 8529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setPrefixes(NamespaceSupport nsSupport, boolean excludeXSLDecl) 8539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws TransformerException 8549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Enumeration decls = nsSupport.getDeclaredPrefixes(); 8579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson while (decls.hasMoreElements()) 8599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String prefix = (String) decls.nextElement(); 8619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == m_declaredPrefixes) 8639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_declaredPrefixes = new ArrayList(); 8649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String uri = nsSupport.getURI(prefix); 8669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (excludeXSLDecl && uri.equals(Constants.S_XSLNAMESPACEURL)) 8689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson continue; 8699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // System.out.println("setPrefixes - "+prefix+", "+uri); 8719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XMLNSDecl decl = new XMLNSDecl(prefix, uri, false); 8729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_declaredPrefixes.add(decl); 8749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 8789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Fullfill the PrefixResolver interface. Calling this for this class 8799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * will throw an error. 8809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param prefix The prefix to look up, which may be an empty string ("") 8829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * for the default Namespace. 8839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param context The node context from which to look up the URI. 8849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 8859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return null if the error listener does not choose to throw an exception. 8869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 8879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String getNamespaceForPrefix(String prefix, org.w3c.dom.Node context) 8889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 8899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson this.error(XSLTErrorResources.ER_CANT_RESOLVE_NSPREFIX, null); 8909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return null; 8929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 8939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 8949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 8959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Given a namespace, get the corrisponding prefix. 8969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9/15/00: This had been iteratively examining the m_declaredPrefixes 8979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * field for this node and its parents. That makes life difficult for 8989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the compilation experiment, which doesn't have a static vector of 8999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * local declarations. Replaced a recursive solution, which permits 9009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * easier subclassing/overriding. 9019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param prefix non-null reference to prefix string, which should map 9039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * to a namespace URL. 9049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return The namespace URL that the prefix maps to, or null if no 9069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * mapping can be found. 9079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 9089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public String getNamespaceForPrefix(String prefix) 9099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// if (null != prefix && prefix.equals("xmlns")) 9119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// { 9129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// return Constants.S_XMLNAMESPACEURI; 9139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson// } 9149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson List nsDecls = m_declaredPrefixes; 9169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != nsDecls) 9189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = nsDecls.size(); 9209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(prefix.equals(Constants.ATTRVAL_DEFAULT_PREFIX)) 9219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson prefix = ""; 9239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < n; i++) 9269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XMLNSDecl decl = (XMLNSDecl) nsDecls.get(i); 9289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (prefix.equals(decl.getPrefix())) 9309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return decl.getURI(); 9319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Not found; ask our ancestors 9359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != m_parentNode) 9369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_parentNode.getNamespaceForPrefix(prefix); 9379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // JJK: No ancestors; try implicit 9399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // %REVIEW% Are there literals somewhere that we should use instead? 9409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // %REVIEW% Is this really the best place to patch? 9419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if("xml".equals(prefix)) 9429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return "http://www.w3.org/XML/1998/namespace"; 9439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // No parent, so no definition 9459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return null; 9469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 9499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The table of {@link XMLNSDecl}s for this element 9509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * and all parent elements, screened for excluded prefixes. 9519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 9529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 9539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private List m_prefixTable; 9549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 9569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Return a table that contains all prefixes available 9579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * within this element context. 9589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return reference to vector of {@link XMLNSDecl}s, which may be null. 9609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 9619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson List getPrefixTable() 9629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_prefixTable; 9649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson void setPrefixTable(List list) { 9679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_prefixTable = list; 9689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 9719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get whether or not the passed URL is contained flagged by 9729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * the "extension-element-prefixes" property. This method is overridden 9739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * by {@link ElemLiteralResult#containsExcludeResultPrefix}. 9749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#extension-element">extension-element in XSLT Specification</a> 9759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param prefix non-null reference to prefix that might be excluded. 9779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return true if the prefix should normally be excluded. 9799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 9809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean containsExcludeResultPrefix(String prefix, String uri) 9819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 9829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement parent = this.getParentElem(); 9839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(null != parent) 9849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return parent.containsExcludeResultPrefix(prefix, uri); 9859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 9879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 9889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 9899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 9909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Tell if the result namespace decl should be excluded. Should be called before 9919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * namespace aliasing (I think). 9929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param prefix non-null reference to prefix. 9949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param uri reference to namespace that prefix maps to, which is protected 9959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * for null, but should really never be passed as null. 9969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return true if the given namespace should be excluded. 9989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 9999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 10009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 10019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson private boolean excludeResultNSDecl(String prefix, String uri) 10029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throws TransformerException 10039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (uri != null) 10069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (uri.equals(Constants.S_XSLNAMESPACEURL) 10089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson || getStylesheet().containsExtensionElementURI(uri)) 10099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return true; 10109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (containsExcludeResultPrefix(prefix, uri)) 10129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return true; 10139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 10169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 10199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Combine the parent's namespaces with this namespace 10209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * for fast processing, taking care to reference the 10219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * parent's namespace if this namespace adds nothing new. 10229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * (Recursive method, walking the elements depth-first, 10239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * processing parents before children). 10249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Note that this method builds m_prefixTable with aliased 10259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * namespaces, *not* the original namespaces. 10269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 10279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 10289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 10299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void resolvePrefixTables() throws TransformerException 10309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Always start with a fresh prefix table! 10329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson setPrefixTable(null); 10339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // If we have declared declarations, then we look for 10359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // a parent that has namespace decls, and add them 10369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // to this element's decls. Otherwise we just point 10379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // to the parent that has decls. 10389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != this.m_declaredPrefixes) 10399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson StylesheetRoot stylesheet = this.getStylesheetRoot(); 10419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Add this element's declared prefixes to the 10439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // prefix table. 10449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = m_declaredPrefixes.size(); 10459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < n; i++) 10479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XMLNSDecl decl = (XMLNSDecl) m_declaredPrefixes.get(i); 10499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String prefix = decl.getPrefix(); 10509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson String uri = decl.getURI(); 10519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(null == uri) 10529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson uri = ""; 10539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean shouldExclude = excludeResultNSDecl(prefix, uri); 10549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Create a new prefix table if one has not already been created. 10569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == m_prefixTable) 10579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson setPrefixTable(new ArrayList()); 10589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson NamespaceAlias nsAlias = stylesheet.getNamespaceAliasComposed(uri); 10609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(null != nsAlias) 10619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Should I leave the non-aliased element in the table as 10639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // an excluded element? 10649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // The exclusion should apply to the non-aliased prefix, so 10669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // we don't calculate it here. -sb 10679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Use stylesheet prefix, as per xsl WG 10689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson decl = new XMLNSDecl(nsAlias.getStylesheetPrefix(), 10699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson nsAlias.getResultNamespace(), shouldExclude); 10709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 10729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson decl = new XMLNSDecl(prefix, uri, shouldExclude); 10739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_prefixTable.add(decl); 10759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement parent = this.getParentNodeElem(); 10809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != parent) 10829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // The prefix table of the parent should never be null! 10859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson List prefixes = parent.m_prefixTable; 10869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null == m_prefixTable && !needToCheckExclude()) 10889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Nothing to combine, so just use parent's table! 10919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson setPrefixTable(parent.m_prefixTable); 10929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 10939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 10949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 10959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Add the prefixes from the parent's prefix table. 10979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = prefixes.size(); 10989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 10999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < n; i++) 11009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XMLNSDecl decl = (XMLNSDecl) prefixes.get(i); 11029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean shouldExclude = excludeResultNSDecl(decl.getPrefix(), 11039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson decl.getURI()); 11049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (shouldExclude != decl.getIsExcluded()) 11069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson decl = new XMLNSDecl(decl.getPrefix(), decl.getURI(), 11089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson shouldExclude); 11099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson //m_prefixTable.addElement(decl); 11129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson addOrReplaceDecls(decl); 11139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (null == m_prefixTable) 11179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // Must be stylesheet element without any result prefixes! 11209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson setPrefixTable(new ArrayList()); 11219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 11259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Add or replace this namespace declaration in list 11269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * of namespaces in scope for this element. 11279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 11289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param newDecl namespace declaration to add to list 11299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 11309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson void addOrReplaceDecls(XMLNSDecl newDecl) 11319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = m_prefixTable.size(); 11339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = n - 1; i >= 0; i--) 11359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XMLNSDecl decl = (XMLNSDecl) m_prefixTable.get(i); 11379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (decl.getPrefix().equals(newDecl.getPrefix())) 11399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return; 11419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_prefixTable.add(newDecl); 11449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 11489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Return whether we need to check namespace prefixes 11499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * against and exclude result prefixes list. 11509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 11519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson boolean needToCheckExclude() 11529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 11549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 11579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Send startPrefixMapping events to the result tree handler 11589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * for all declared prefix mappings in the stylesheet. 11599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 11609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param transformer non-null reference to the the current transform-time state. 11619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 11629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 11639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 11649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson void executeNSDecls(TransformerImpl transformer) throws TransformerException 11659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson executeNSDecls(transformer, null); 11679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 11709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Send startPrefixMapping events to the result tree handler 11719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * for all declared prefix mappings in the stylesheet. 11729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 11739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param transformer non-null reference to the the current transform-time state. 11749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param ignorePrefix string prefix to not startPrefixMapping 11759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 11769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 11779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 11789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson void executeNSDecls(TransformerImpl transformer, String ignorePrefix) throws TransformerException 11799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 11819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != m_prefixTable) 11839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson SerializationHandler rhandler = transformer.getResultTreeHandler(); 11859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = m_prefixTable.size(); 11869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = n - 1; i >= 0; i--) 11889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XMLNSDecl decl = (XMLNSDecl) m_prefixTable.get(i); 11909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 11919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (!decl.getIsExcluded() && !(null != ignorePrefix && decl.getPrefix().equals(ignorePrefix))) 11929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 11939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson rhandler.startPrefixMapping(decl.getPrefix(), decl.getURI(), true); 11949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 11989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch(org.xml.sax.SAXException se) 11999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 12009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new TransformerException(se); 12019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 12059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Send endPrefixMapping events to the result tree handler 12069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * for all declared prefix mappings in the stylesheet. 12079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 12089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param transformer non-null reference to the the current transform-time state. 12099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 12109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 12119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 12129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson void unexecuteNSDecls(TransformerImpl transformer) throws TransformerException 12139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 12149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson unexecuteNSDecls(transformer, null); 12159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 12189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Send endPrefixMapping events to the result tree handler 12199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * for all declared prefix mappings in the stylesheet. 12209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 12219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param transformer non-null reference to the the current transform-time state. 12229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param ignorePrefix string prefix to not endPrefixMapping 12239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 12249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 12259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 12269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson void unexecuteNSDecls(TransformerImpl transformer, String ignorePrefix) throws TransformerException 12279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 12289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson try 12309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 12319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (null != m_prefixTable) 12329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 12339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson SerializationHandler rhandler = transformer.getResultTreeHandler(); 12349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int n = m_prefixTable.size(); 12359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (int i = 0; i < n; i++) 12379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 12389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson XMLNSDecl decl = (XMLNSDecl) m_prefixTable.get(i); 12399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (!decl.getIsExcluded() && !(null != ignorePrefix && decl.getPrefix().equals(ignorePrefix))) 12419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 12429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson rhandler.endPrefixMapping(decl.getPrefix()); 12439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson catch(org.xml.sax.SAXException se) 12489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 12499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson throw new TransformerException(se); 12509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** The *relative* document order number of this element. 12549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial */ 12559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected int m_docOrderNumber = -1; 12569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 12589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Set the UID (document order index). 12599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 12609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param i Index of this child. 12619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 12629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setUid(int i) 12639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 12649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_docOrderNumber = i; 12659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 12689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the UID (document order index). 12699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 12709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return Index of this child 12719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 12729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int getUid() 12739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 12749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_docOrderNumber; 12759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 12799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Parent node. 12809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 12819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 12829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected ElemTemplateElement m_parentNode; 12839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 12859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the parent as a Node. 12869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 12879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return This node's parent node 12889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 12899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Node getParentNode() 12909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 12919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_parentNode; 12929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 12939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 12949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 12959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the parent as an ElemTemplateElement. 12969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 12979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return This node's parent as an ElemTemplateElement 12989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 12999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ElemTemplateElement getParentElem() 13009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 13019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_parentNode; 13029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 13059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Set the parent as an ElemTemplateElement. 13069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 13079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param p This node's parent as an ElemTemplateElement 13089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 13099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setParentElem(ElemTemplateElement p) 13109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 13119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_parentNode = p; 13129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 13159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Next sibling. 13169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 13179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 13189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement m_nextSibling; 13199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 13219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the next sibling (as a Node) or return null. 13229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 13239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return this node's next sibling or null 13249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 13259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Node getNextSibling() 13269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 13279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_nextSibling; 13289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 13319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the previous sibling (as a Node) or return null. 13329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Note that this may be expensive if the parent has many kids; 13339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * we accept that price in exchange for avoiding the prev pointer 13349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * TODO: If we were sure parents and sibs are always ElemTemplateElements, 13359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * we could hit the fields directly rather than thru accessors. 13369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 13379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return This node's previous sibling or null 13389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 13399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Node getPreviousSibling() 13409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 13419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson Node walker = getParentNode(), prev = null; 13439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (walker != null) 13459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (walker = walker.getFirstChild(); walker != null; 13469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson prev = walker, walker = walker.getNextSibling()) 13479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 13489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (walker == this) 13499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return prev; 13509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return null; 13539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 13569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the previous sibling (as a Node) or return null. 13579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Note that this may be expensive if the parent has many kids; 13589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * we accept that price in exchange for avoiding the prev pointer 13599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * TODO: If we were sure parents and sibs are always ElemTemplateElements, 13609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * we could hit the fields directly rather than thru accessors. 13619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 13629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return This node's previous sibling or null 13639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 13649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ElemTemplateElement getPreviousSiblingElem() 13659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 13669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement walker = getParentNodeElem(); 13689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement prev = null; 13699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (walker != null) 13719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (walker = walker.getFirstChildElem(); walker != null; 13729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson prev = walker, walker = walker.getNextSiblingElem()) 13739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 13749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (walker == this) 13759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return prev; 13769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return null; 13799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 13839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the next sibling (as a ElemTemplateElement) or return null. 13849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 13859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return This node's next sibling (as a ElemTemplateElement) or null 13869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 13879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ElemTemplateElement getNextSiblingElem() 13889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 13899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_nextSibling; 13909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 13919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 13929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 13939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the parent element. 13949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 13959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return This node's next parent (as a ElemTemplateElement) or null 13969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 13979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ElemTemplateElement getParentNodeElem() 13989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 13999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_parentNode; 14009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 14019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 14029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 14039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 14049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * First child. 14059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @serial 14069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 14079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement m_firstChild; 14089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 14099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 14109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the first child as a Node. 14119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 14129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return This node's first child or null 14139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 14149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Node getFirstChild() 14159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 14169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_firstChild; 14179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 14189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 14199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 14209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the first child as a ElemTemplateElement. 14219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 14229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return This node's first child (as a ElemTemplateElement) or null 14239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 14249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ElemTemplateElement getFirstChildElem() 14259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 14269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_firstChild; 14279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 14289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 14299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 14309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the last child. 14319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 14329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return This node's last child 14339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 14349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public Node getLastChild() 14359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 14369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 14379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement lastChild = null; 14389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 14399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (ElemTemplateElement node = m_firstChild; node != null; 14409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson node = node.m_nextSibling) 14419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 14429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson lastChild = node; 14439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 14449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 14459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return lastChild; 14469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 14479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 14489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 14499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the last child. 14509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 14519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return This node's last child 14529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 14539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ElemTemplateElement getLastChildElem() 14549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 14559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 14569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement lastChild = null; 14579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 14589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (ElemTemplateElement node = m_firstChild; node != null; 14599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson node = node.m_nextSibling) 14609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 14619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson lastChild = node; 14629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 14639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 14649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return lastChild; 14659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 14669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 14679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 14689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** DOM backpointer that this element originated from. */ 14699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson transient private org.w3c.dom.Node m_DOMBackPointer; 14709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 14719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 14729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * If this stylesheet was created from a DOM, get the 14739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * DOM backpointer that this element originated from. 14749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * For tooling use. 14759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 14769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return DOM backpointer that this element originated from or null. 14779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 14789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public org.w3c.dom.Node getDOMBackPointer() 14799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 14809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return m_DOMBackPointer; 14819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 14829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 14839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 14849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * If this stylesheet was created from a DOM, set the 14859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * DOM backpointer that this element originated from. 14869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * For tooling use. 14879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 14889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param n DOM backpointer that this element originated from. 14899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 14909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void setDOMBackPointer(org.w3c.dom.Node n) 14919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 14929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson m_DOMBackPointer = n; 14939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 14949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 14959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 14969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Compares this object with the specified object for precedence order. 14979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * The order is determined by the getImportCountComposed() of the containing 14989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * composed stylesheet and the getUid() of this element. 14999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Returns a negative integer, zero, or a positive integer as this 15009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * object is less than, equal to, or greater than the specified object. 15019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 15029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param o The object to be compared to this object 15039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return a negative integer, zero, or a positive integer as this object is 15049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * less than, equal to, or greater than the specified object. 15059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws ClassCastException if the specified object's 15069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * type prevents it from being compared to this Object. 15079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 15089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int compareTo(Object o) throws ClassCastException { 15099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 15109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson ElemTemplateElement ro = (ElemTemplateElement) o; 15119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int roPrecedence = ro.getStylesheetComposed().getImportCountComposed(); 15129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson int myPrecedence = this.getStylesheetComposed().getImportCountComposed(); 15139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 15149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if (myPrecedence < roPrecedence) 15159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return -1; 15169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else if (myPrecedence > roPrecedence) 15179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return 1; 15189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson else 15199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return this.getUid() - ro.getUid(); 15209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 15219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 15229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 15239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get information about whether or not an element should strip whitespace. 15249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#strip">strip in XSLT Specification</a> 15259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 15269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param support The XPath runtime state. 15279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param targetElement Element to check 15289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 15299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return true if the whitespace should be stripped. 15309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 15319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @throws TransformerException 15329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 15339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean shouldStripWhiteSpace( 15349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson org.apache.xpath.XPathContext support, 15359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson org.w3c.dom.Element targetElement) throws TransformerException 15369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 15379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson StylesheetRoot sroot = this.getStylesheetRoot(); 15389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (null != sroot) ? sroot.shouldStripWhiteSpace(support, targetElement) :false; 15399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 15409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 15419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 15429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get information about whether or not whitespace can be stripped. 15439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#strip">strip in XSLT Specification</a> 15449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 15459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return true if the whitespace can be stripped. 15469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 15479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean canStripWhiteSpace() 15489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 15499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson StylesheetRoot sroot = this.getStylesheetRoot(); 15509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (null != sroot) ? sroot.canStripWhiteSpace() : false; 15519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 15529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 15539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 15549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Tell if this element can accept variable declarations. 15559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return true if the element can accept and process variable declarations. 15569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 15579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean canAcceptVariables() 15589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 15599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return true; 15609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 15619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 15629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson //=============== ExpressionNode methods ================ 15639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 15649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 15659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Set the parent of this node. 15669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param n Must be a ElemTemplateElement. 15679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 15689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void exprSetParent(ExpressionNode n) 15699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 15709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // This obviously requires that only a ElemTemplateElement can 15719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson // parent a node of this type. 15729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson setParentElem((ElemTemplateElement)n); 15739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 15749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 15759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 15769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Get the ExpressionNode parent of this node. 15779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 15789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ExpressionNode exprGetParent() 15799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 15809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return getParentElem(); 15819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 15829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 15839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 15849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * This method tells the node to add its argument to the node's 15859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * list of children. 15869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param n Must be a ElemTemplateElement. 15879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 15889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void exprAddChild(ExpressionNode n, int i) 15899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 15909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson appendChild((ElemTemplateElement)n); 15919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 15929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 15939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** This method returns a child node. The children are numbered 15949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson from zero, left to right. */ 15959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public ExpressionNode exprGetChild(int i) 15969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 15979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return (ExpressionNode)item(i); 15989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 15999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 16009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** Return the number of children the node has. */ 16019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public int exprGetNumChildren() 16029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 16039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return getLength(); 16049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 16059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 16069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 16079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Accept a visitor and call the appropriate method 16089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * for this class. 16099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * 16109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param visitor The visitor whose appropriate method will be called. 16119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @return true if the children of the object should be visited. 16129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 16139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected boolean accept(XSLTVisitor visitor) 16149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 16159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return visitor.visitInstruction(this); 16169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 16179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 16189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 16199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see XSLTVisitable#callVisitors(XSLTVisitor) 16209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 16219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public void callVisitors(XSLTVisitor visitor) 16229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 16239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson if(accept(visitor)) 16249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 16259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson callChildVisitors(visitor); 16269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 16279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 16289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 16299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 16309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Call the children visitors. 16319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param visitor The visitor whose appropriate method will be called. 16329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 16339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected void callChildVisitors(XSLTVisitor visitor, boolean callAttributes) 16349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 16359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson for (ElemTemplateElement node = m_firstChild; 16369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson node != null; 16379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson node = node.m_nextSibling) 16389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 16399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson node.callVisitors(visitor); 16409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 16419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 16429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 16439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 16449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Call the children visitors. 16459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @param visitor The visitor whose appropriate method will be called. 16469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 16479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson protected void callChildVisitors(XSLTVisitor visitor) 16489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson { 16499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson callChildVisitors(visitor, true); 16509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 16519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 16529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 16539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson /** 16549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see PrefixResolver#handlesNullPrefixes() 16559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */ 16569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson public boolean handlesNullPrefixes() { 16579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson return false; 16589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson } 16599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 16609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson} 1661