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