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: ElemAttribute.java 469304 2006-10-30 22:29:47Z 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.NamespaceMappings;
289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.serializer.SerializationHandler;
299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.QName;
309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.apache.xml.utils.XML11Char;
319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonimport org.xml.sax.SAXException;
339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson/**
359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * Implement xsl:attribute.
369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * <pre>
379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * &amp;!ELEMENT xsl:attribute %char-template;>
389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * &amp;!ATTLIST xsl:attribute
399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *   name %avt; #REQUIRED
409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *   namespace %avt; #IMPLIED
419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson *   %space-att;
429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * &amp;
439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * </pre>
449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @see <a href="http://www.w3.org/TR/xslt#creating-attributes">creating-attributes in XSLT Specification</a>
459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson * @xsl.usage advanced
469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson */
479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilsonpublic class ElemAttribute extends ElemElement
489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson{
499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    static final long serialVersionUID = 8817220961566919187L;
509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Get an int constant identifying the type of element.
539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see org.apache.xalan.templates.Constants
549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The token ID for this element
569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public int getXSLToken()
589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return Constants.ELEMNAME_ATTRIBUTE;
609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Return the node name.
649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The element name
669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public String getNodeName()
689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return Constants.ELEMNAME_ATTRIBUTE_STRING;
709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Create an attribute in the result tree.
749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @see <a href="http://www.w3.org/TR/xslt#creating-attributes">creating-attributes in XSLT Specification</a>
759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param transformer non-null reference to the the current transform-time state.
779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  public void execute(
819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//          TransformerImpl transformer)
829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//            throws TransformerException
839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  {
849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //SerializationHandler rhandler = transformer.getSerializationHandler();
859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // If they are trying to add an attribute when there isn't an
879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // element pending, it is an error.
889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // I don't think we need this check here because it is checked in
899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // ResultTreeHandler.addAttribute.  (is)
909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    if (!rhandler.isElementPending())
919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    {
929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//      // Make sure the trace event is sent.
939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//      if (TransformerImpl.S_DEBUG)
949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//        transformer.getTraceManager().fireTraceEvent(this);
959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//
969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//      XPathContext xctxt = transformer.getXPathContext();
979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//      int sourceNode = xctxt.getCurrentNode();
989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//      String attrName = m_name_avt.evaluate(xctxt, sourceNode, this);
999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//      transformer.getMsgMgr().warn(this,
1009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//                                   XSLTErrorResources.WG_ILLEGAL_ATTRIBUTE_POSITION,
1019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//                                   new Object[]{ attrName });
1029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//
1039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//      if (TransformerImpl.S_DEBUG)
1049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//        transformer.getTraceManager().fireTraceEndEvent(this);
1059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//      return;
1069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//
1079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//      // warn(templateChild, sourceNode, "Trying to add attribute after element child has been added, ignoring...");
1089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    }
1099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//    super.execute(transformer);
1119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson//  }
1139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Resolve the namespace into a prefix.  At this level, if no prefix exists,
1169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * then return a manufactured prefix.
1179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param rhandler The current result tree handler.
1199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param prefix The probable prefix if already known.
1209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeNamespace  The namespace, which should not be null.
1219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The prefix to be used.
1239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  protected String resolvePrefix(SerializationHandler rhandler,
1259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                                 String prefix, String nodeNamespace)
1269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    throws TransformerException
1279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if (null != prefix && (prefix.length() == 0 || prefix.equals("xmlns")))
1309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Since we can't use default namespace, in this case we try and
1329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // see if a prefix has already been defined or this namespace.
1339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      prefix = rhandler.getPrefix(nodeNamespace);
1349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // System.out.println("nsPrefix: "+nsPrefix);
1369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if (null == prefix || prefix.length() == 0 || prefix.equals("xmlns"))
1379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
1389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(nodeNamespace.length() > 0)
1399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
1409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            NamespaceMappings prefixMapping = rhandler.getNamespaceMappings();
1419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            prefix = prefixMapping.generateNextPrefix();
1429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        else
1449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          prefix = "";
1459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
1469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
1479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return prefix;
1489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
1499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Validate that the node name is good.
1529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeName Name of the node being constructed, which may be null.
1549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return true if the node name is valid, false otherwise.
1569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   protected boolean validateNodeName(String nodeName)
1589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   {
1599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(null == nodeName)
1609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return false;
1619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      if(nodeName.equals("xmlns"))
1629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        return false;
1639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      return XML11Char.isXML11ValidQName(nodeName);
1649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   }
1659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
1679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Construct a node in the result tree.  This method is overloaded by
1689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * xsl:attribute. At this class level, this method creates an element.
1699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeName The name of the node, which may be null.
1719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param prefix The prefix for the namespace, which may be null.
1729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param nodeNamespace The namespace of the node, which may be null.
1739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param transformer non-null reference to the the current transform-time state.
1749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param sourceNode non-null reference to the <a href="http://www.w3.org/TR/xslt#dt-current-node">current source node</a>.
1759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param mode reference, which may be null, to the <a href="http://www.w3.org/TR/xslt#modes">current mode</a>.
1769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
1779f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws TransformerException
1789f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
1799f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  void constructNode(
1809f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson          String nodeName, String prefix, String nodeNamespace, TransformerImpl transformer)
1819f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            throws TransformerException
1829f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
1839f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1849f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    if(null != nodeName && nodeName.length() > 0)
1859f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
1869f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      SerializationHandler rhandler = transformer.getSerializationHandler();
1879f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
1889f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // Evaluate the value of this attribute
1899f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      String val = transformer.transformToString(this);
1909f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      try
1919f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
1929f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        // Let the result tree handler add the attribute and its String value.
1939f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        String localName = QName.getLocalPart(nodeName);
1949f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if(prefix != null && prefix.length() > 0){
1959f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            rhandler.addAttribute(nodeNamespace, localName, nodeName, "CDATA", val, true);
1969f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }else{
1979f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            rhandler.addAttribute("", localName, nodeName, "CDATA", val, true);
1989f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
1999f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
2009f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      catch (SAXException e)
2019f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      {
2029f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      }
2039f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2049f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2059f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2069f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2079f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  /**
2089f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * Add a child to the child list.
2099f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <!ELEMENT xsl:attribute %char-template;>
2109f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * <!ATTLIST xsl:attribute
2119f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   name %avt; #REQUIRED
2129f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   namespace %avt; #IMPLIED
2139f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *   %space-att;
2149f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * >
2159f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2169f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @param newChild Child to append to the list of this node's children
2179f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2189f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @return The node we just appended to the children list
2199f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   *
2209f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   * @throws DOMException
2219f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson   */
2229f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  public ElemTemplateElement appendChild(ElemTemplateElement newChild)
2239f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  {
2249f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2259f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    int type = ((ElemTemplateElement) newChild).getXSLToken();
2269f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2279f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    switch (type)
2289f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    {
2299f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2309f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    // char-instructions
2319f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Constants.ELEMNAME_TEXTLITERALRESULT :
2329f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Constants.ELEMNAME_APPLY_TEMPLATES :
2339f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Constants.ELEMNAME_APPLY_IMPORTS :
2349f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Constants.ELEMNAME_CALLTEMPLATE :
2359f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Constants.ELEMNAME_FOREACH :
2369f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Constants.ELEMNAME_VALUEOF :
2379f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Constants.ELEMNAME_COPY_OF :
2389f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Constants.ELEMNAME_NUMBER :
2399f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Constants.ELEMNAME_CHOOSE :
2409f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Constants.ELEMNAME_IF :
2419f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Constants.ELEMNAME_TEXT :
2429f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Constants.ELEMNAME_COPY :
2439f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Constants.ELEMNAME_VARIABLE :
2449f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    case Constants.ELEMNAME_MESSAGE :
2459f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2469f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // instructions
2479f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // case Constants.ELEMNAME_PI:
2489f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // case Constants.ELEMNAME_COMMENT:
2499f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // case Constants.ELEMNAME_ELEMENT:
2509f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      // case Constants.ELEMNAME_ATTRIBUTE:
2519f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      break;
2529f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    default :
2539f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson      error(XSLTErrorResources.ER_CANNOT_ADD,
2549f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            new Object[]{ newChild.getNodeName(),
2559f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                          this.getNodeName() });  //"Can not add " +((ElemTemplateElement)newChild).m_elemName +
2569f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2579f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    //" to " + this.m_elemName);
2589f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    }
2599f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2609f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson    return super.appendChild(newChild);
2619f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson  }
2629f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	/**
2639f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 * @see ElemElement#setName(AVT)
2649f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	 */
2659f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	public void setName(AVT v) {
2669f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        if (v.isSimple())
2679f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        {
2689f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            if (v.getSimpleString().equals("xmlns"))
2699f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            {
2709f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson                throw new IllegalArgumentException();
2719f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson            }
2729f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson        }
2739f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson		super.setName(v);
2749f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson	}
2759f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson
2769f8118474e9513f7a5b7d2a05e4a0fb15d1a6569Jesse Wilson}
277