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