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: ElemElement.java 468643 2006-10-28 06:56:03Z minchau $
209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpackage org.apache.xalan.templates;
229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport javax.xml.transform.TransformerException;
249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.res.XSLTErrorResources;
269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xalan.transformer.TransformerImpl;
279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.SerializationHandler;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.QName;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.XML11Char;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xpath.XPathContext;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.SAXException;
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Implement xsl:element
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <pre>
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <!ELEMENT xsl:element %template;>
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <!ATTLIST xsl:element
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *   name %avt; #REQUIRED
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *   namespace %avt; #IMPLIED
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *   use-attribute-sets %qnames; #IMPLIED
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *   %space-att;
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * >
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * </pre>
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#section-Creating-Elements-with-xsl:element">XXX in XSLT Specification</a>
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class ElemElement extends ElemUse
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final long serialVersionUID = -324619535592435183L;
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The name attribute is interpreted as an attribute value template.
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * It is an error if the string that results from instantiating the
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * attribute value template is not a QName.
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected AVT m_name_avt = null;
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the "name" attribute.
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The name attribute is interpreted as an attribute value template.
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * It is an error if the string that results from instantiating the
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * attribute value template is not a QName.
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param v Name attribute to set for this element
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setName(AVT v)
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_name_avt = v;
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the "name" attribute.
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The name attribute is interpreted as an attribute value template.
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * It is an error if the string that results from instantiating the
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * attribute value template is not a QName.
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Name attribute for this element
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public AVT getName()
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_name_avt;
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If the namespace attribute is present, then it also is interpreted
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * as an attribute value template. The string that results from
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * instantiating the attribute value template should be a URI reference.
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * It is not an error if the string is not a syntactically legal URI reference.
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @serial
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected AVT m_namespace_avt = null;
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Set the "namespace" attribute.
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If the namespace attribute is present, then it also is interpreted
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * as an attribute value template. The string that results from
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * instantiating the attribute value template should be a URI reference.
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * It is not an error if the string is not a syntactically legal URI reference.
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param v NameSpace attribute to set for this element
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void setNamespace(AVT v)
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    m_namespace_avt = v;
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get the "namespace" attribute.
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If the namespace attribute is present, then it also is interpreted
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * as an attribute value template. The string that results from
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * instantiating the attribute value template should be a URI reference.
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * It is not an error if the string is not a syntactically legal URI reference.
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return Namespace attribute for this element
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public AVT getNamespace()
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return m_namespace_avt;
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * This function is called after everything else has been
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * recomposed, and allows the template to set remaining
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * values that may be based on some other property that
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * depends on recomposition.
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void compose(StylesheetRoot sroot) throws TransformerException
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    super.compose(sroot);
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    StylesheetRoot.ComposeState cstate = sroot.getComposeState();
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    java.util.Vector vnames = cstate.getVariableNames();
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(null != m_name_avt)
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_name_avt.fixupVariables(vnames, cstate.getGlobalsSize());
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(null != m_namespace_avt)
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      m_namespace_avt.fixupVariables(vnames, cstate.getGlobalsSize());
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get an int constant identifying the type of element.
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.apache.xalan.templates.Constants
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The token ID for this element
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getXSLToken()
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return Constants.ELEMNAME_ELEMENT;
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the node name.
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return This element's name
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getNodeName()
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return Constants.ELEMNAME_ELEMENT_STRING;
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Resolve the namespace into a prefix.  Meant to be
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * overidded by elemAttribute if this class is derived.
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param rhandler The current result tree handler.
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param prefix The probable prefix if already known.
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeNamespace  The namespace.
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The prefix to be used.
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected String resolvePrefix(SerializationHandler rhandler,
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                 String prefix, String nodeNamespace)
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    throws TransformerException
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    if (null != prefix && prefix.length() == 0)
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    {
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//      String foundPrefix = rhandler.getPrefix(nodeNamespace);
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//      // System.out.println("nsPrefix: "+nsPrefix);
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//      if (null == foundPrefix)
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//        foundPrefix = "";
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    }
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return prefix;
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create an element in the result tree.
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * The xsl:element element allows an element to be created with a
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * computed name. The expanded-name of the element to be created
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * is specified by a required name attribute and an optional namespace
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * attribute. The content of the xsl:element element is a template
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * for the attributes and children of the created element.
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param transformer non-null reference to the the current transform-time state.
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public void execute(
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          TransformerImpl transformer)
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws TransformerException
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson 	SerializationHandler rhandler = transformer.getSerializationHandler();
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    XPathContext xctxt = transformer.getXPathContext();
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int sourceNode = xctxt.getCurrentNode();
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String nodeName = m_name_avt == null ? null : m_name_avt.evaluate(xctxt, sourceNode, this);
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String prefix = null;
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    String nodeNamespace = "";
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // Only validate if an AVT was used.
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if ((nodeName != null) && (!m_name_avt.isSimple()) && (!XML11Char.isXML11ValidQName(nodeName)))
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      transformer.getMsgMgr().warn(
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        this, XSLTErrorResources.WG_ILLEGAL_ATTRIBUTE_VALUE,
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        new Object[]{ Constants.ATTRNAME_NAME, nodeName });
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      nodeName = null;
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    else if (nodeName != null)
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      prefix = QName.getPrefixPart(nodeName);
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null != m_namespace_avt)
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        nodeNamespace = m_namespace_avt.evaluate(xctxt, sourceNode, this);
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null == nodeNamespace ||
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            (prefix != null && prefix.length()>0 && nodeNamespace.length()== 0) )
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          transformer.getMsgMgr().error(
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              this, XSLTErrorResources.ER_NULL_URI_NAMESPACE);
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Determine the actual prefix that we will use for this nodeNamespace
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        prefix = resolvePrefix(rhandler, prefix, nodeNamespace);
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null == prefix)
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          prefix = "";
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (prefix.length() > 0)
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          nodeName = (prefix + ":" + QName.getLocalPart(nodeName));
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          nodeName = QName.getLocalPart(nodeName);
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // No namespace attribute was supplied. Use the namespace declarations
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // currently in effect for the xsl:element element.
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        try
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // Maybe temporary, until I get this worked out.  test: axes59
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          nodeNamespace = getNamespaceForPrefix(prefix);
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // If we get back a null nodeNamespace, that means that this prefix could
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // not be found in the table.  This is okay only for a default namespace
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          // that has never been declared.
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          if ( (null == nodeNamespace) && (prefix.length() == 0) )
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            nodeNamespace = "";
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          else if (null == nodeNamespace)
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          {
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            transformer.getMsgMgr().warn(
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              this, XSLTErrorResources.WG_COULD_NOT_RESOLVE_PREFIX,
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson              new Object[]{ prefix });
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            nodeName = null;
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          }
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        catch (Exception ex)
2779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          transformer.getMsgMgr().warn(
2799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            this, XSLTErrorResources.WG_COULD_NOT_RESOLVE_PREFIX,
2809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            new Object[]{ prefix });
2819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          nodeName = null;
2839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
2859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    constructNode(nodeName, prefix, nodeNamespace, transformer);
2889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct a node in the result tree.  This method is overloaded by
2929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * xsl:attribute. At this class level, this method creates an element.
2939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * If the node is null, we instantiate only the content of the node in accordance
2949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * with section 7.1.2 of the XSLT 1.0 Recommendation.
2959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeName The name of the node, which may be <code>null</code>.  If <code>null</code>,
2979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *                 only the non-attribute children of this node will be processed.
2989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param prefix The prefix for the namespace, which may be <code>null</code>.
2999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *               If not <code>null</code>, this prefix will be mapped and unmapped.
3009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeNamespace The namespace of the node, which may be not be <code>null</code>.
3019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param transformer non-null reference to the the current transform-time state.
3029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
3039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
3049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  void constructNode(
3069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          String nodeName, String prefix, String nodeNamespace, TransformerImpl transformer)
3079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws TransformerException
3089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    boolean shouldAddAttrs;
3119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    try
3139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      SerializationHandler rhandler = transformer.getResultTreeHandler();
3159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null == nodeName)
3179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        shouldAddAttrs = false;
3199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      else
3219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null != prefix)
3239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          rhandler.startPrefixMapping(prefix, nodeNamespace, true);
3259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        rhandler.startElement(nodeNamespace, QName.getLocalPart(nodeName),
3289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                              nodeName);
3299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        super.execute(transformer);
3319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        shouldAddAttrs = true;
3339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      transformer.executeChildTemplates(this, shouldAddAttrs);
3369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Now end the element if name was valid
3389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null != nodeName)
3399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
3409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        rhandler.endElement(nodeNamespace, QName.getLocalPart(nodeName),
3419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                            nodeName);
3429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (null != prefix)
3439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
3449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          rhandler.endPrefixMapping(prefix);
3459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
3469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
3479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    catch (SAXException se)
3499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
3509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      throw new TransformerException(se);
3519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
3529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
3559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Call the children visitors.
3569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param visitor The visitor whose appropriate method will be called.
3579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
3589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected void callChildVisitors(XSLTVisitor visitor, boolean callAttrs)
3599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
3609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	if(callAttrs)
3619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	{
3629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	  if(null != m_name_avt)
3639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  		m_name_avt.callVisitors(visitor);
3649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	  if(null != m_namespace_avt)
3669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  		m_namespace_avt.callVisitors(visitor);
3679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  	}
3689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    super.callChildVisitors(visitor, callAttrs);
3709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
3719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
3729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
373