1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 */ 18 /* 19 * $Id: ProcessorOutputElem.java 468640 2006-10-28 06:53:53Z minchau $ 20 */ 21 package org.apache.xalan.processor; 22 23 import javax.xml.transform.OutputKeys; 24 import javax.xml.transform.TransformerException; 25 26 import org.apache.xalan.templates.ElemTemplateElement; 27 import org.apache.xalan.templates.OutputProperties; 28 import org.apache.xml.serializer.OutputPropertiesFactory; 29 import org.apache.xml.utils.QName; 30 import org.apache.xml.utils.SystemIDResolver; 31 import org.xml.sax.Attributes; 32 33 /** 34 * TransformerFactory for xsl:output markup. 35 * @see <a href="http://www.w3.org/TR/xslt#dtd">XSLT DTD</a> 36 * @see <a href="http://www.w3.org/TR/xslt#output">output in XSLT Specification</a> 37 */ 38 class ProcessorOutputElem extends XSLTElementProcessor 39 { 40 static final long serialVersionUID = 3513742319582547590L; 41 42 /** The output properties, set temporarily while the properties are 43 * being set from the attributes, and then nulled after that operation 44 * is completed. */ 45 private OutputProperties m_outputProperties; 46 47 /** 48 * Set the cdata-section-elements property from the attribute value. 49 * @see javax.xml.transform.OutputKeys#CDATA_SECTION_ELEMENTS 50 * @param newValue non-null reference to processed attribute value. 51 */ setCdataSectionElements(java.util.Vector newValue)52 public void setCdataSectionElements(java.util.Vector newValue) 53 { 54 m_outputProperties.setQNameProperties(OutputKeys.CDATA_SECTION_ELEMENTS, newValue); 55 } 56 57 /** 58 * Set the doctype-public property from the attribute value. 59 * @see javax.xml.transform.OutputKeys#DOCTYPE_PUBLIC 60 * @param newValue non-null reference to processed attribute value. 61 */ setDoctypePublic(String newValue)62 public void setDoctypePublic(String newValue) 63 { 64 m_outputProperties.setProperty(OutputKeys.DOCTYPE_PUBLIC, newValue); 65 } 66 67 /** 68 * Set the doctype-system property from the attribute value. 69 * @see javax.xml.transform.OutputKeys#DOCTYPE_SYSTEM 70 * @param newValue non-null reference to processed attribute value. 71 */ setDoctypeSystem(String newValue)72 public void setDoctypeSystem(String newValue) 73 { 74 m_outputProperties.setProperty(OutputKeys.DOCTYPE_SYSTEM, newValue); 75 } 76 77 /** 78 * Set the encoding property from the attribute value. 79 * @see javax.xml.transform.OutputKeys#ENCODING 80 * @param newValue non-null reference to processed attribute value. 81 */ setEncoding(String newValue)82 public void setEncoding(String newValue) 83 { 84 m_outputProperties.setProperty(OutputKeys.ENCODING, newValue); 85 } 86 87 /** 88 * Set the indent property from the attribute value. 89 * @see javax.xml.transform.OutputKeys#INDENT 90 * @param newValue non-null reference to processed attribute value. 91 */ setIndent(boolean newValue)92 public void setIndent(boolean newValue) 93 { 94 m_outputProperties.setBooleanProperty(OutputKeys.INDENT, newValue); 95 } 96 97 /** 98 * Set the media type property from the attribute value. 99 * @see javax.xml.transform.OutputKeys#MEDIA_TYPE 100 * @param newValue non-null reference to processed attribute value. 101 */ setMediaType(String newValue)102 public void setMediaType(String newValue) 103 { 104 m_outputProperties.setProperty(OutputKeys.MEDIA_TYPE, newValue); 105 } 106 107 /** 108 * Set the method property from the attribute value. 109 * @see javax.xml.transform.OutputKeys#METHOD 110 * @param newValue non-null reference to processed attribute value. 111 */ setMethod(org.apache.xml.utils.QName newValue)112 public void setMethod(org.apache.xml.utils.QName newValue) 113 { 114 m_outputProperties.setQNameProperty(OutputKeys.METHOD, newValue); 115 } 116 117 /** 118 * Set the omit-xml-declaration property from the attribute value. 119 * @see javax.xml.transform.OutputKeys#OMIT_XML_DECLARATION 120 * @param newValue processed attribute value. 121 */ setOmitXmlDeclaration(boolean newValue)122 public void setOmitXmlDeclaration(boolean newValue) 123 { 124 m_outputProperties.setBooleanProperty(OutputKeys.OMIT_XML_DECLARATION, newValue); 125 } 126 127 /** 128 * Set the standalone property from the attribute value. 129 * @see javax.xml.transform.OutputKeys#STANDALONE 130 * @param newValue processed attribute value. 131 */ setStandalone(boolean newValue)132 public void setStandalone(boolean newValue) 133 { 134 m_outputProperties.setBooleanProperty(OutputKeys.STANDALONE, newValue); 135 } 136 137 /** 138 * Set the version property from the attribute value. 139 * @see javax.xml.transform.OutputKeys#VERSION 140 * @param newValue non-null reference to processed attribute value. 141 */ setVersion(String newValue)142 public void setVersion(String newValue) 143 { 144 m_outputProperties.setProperty(OutputKeys.VERSION, newValue); 145 } 146 147 /** 148 * Set a foreign property from the attribute value. 149 * @param newValue non-null reference to attribute value. 150 */ setForeignAttr(String attrUri, String attrLocalName, String attrRawName, String attrValue)151 public void setForeignAttr(String attrUri, String attrLocalName, String attrRawName, String attrValue) 152 { 153 QName key = new QName(attrUri, attrLocalName); 154 m_outputProperties.setProperty(key, attrValue); 155 } 156 157 /** 158 * Set a foreign property from the attribute value. 159 * @param newValue non-null reference to attribute value. 160 */ addLiteralResultAttribute(String attrUri, String attrLocalName, String attrRawName, String attrValue)161 public void addLiteralResultAttribute(String attrUri, String attrLocalName, String attrRawName, String attrValue) 162 { 163 QName key = new QName(attrUri, attrLocalName); 164 m_outputProperties.setProperty(key, attrValue); 165 } 166 167 /** 168 * Receive notification of the start of an xsl:output element. 169 * 170 * @param handler The calling StylesheetHandler/TemplatesBuilder. 171 * @param uri The Namespace URI, or the empty string if the 172 * element has no Namespace URI or if Namespace 173 * processing is not being performed. 174 * @param localName The local name (without prefix), or the 175 * empty string if Namespace processing is not being 176 * performed. 177 * @param rawName The raw XML 1.0 name (with prefix), or the 178 * empty string if raw names are not available. 179 * @param attributes The attributes attached to the element. If 180 * there are no attributes, it shall be an empty 181 * Attributes object. 182 * 183 * @throws org.xml.sax.SAXException 184 */ startElement( StylesheetHandler handler, String uri, String localName, String rawName, Attributes attributes)185 public void startElement( 186 StylesheetHandler handler, String uri, String localName, String rawName, Attributes attributes) 187 throws org.xml.sax.SAXException 188 { 189 // Hmmm... for the moment I don't think I'll have default properties set for this. -sb 190 m_outputProperties = new OutputProperties(); 191 192 m_outputProperties.setDOMBackPointer(handler.getOriginatingNode()); 193 m_outputProperties.setLocaterInfo(handler.getLocator()); 194 m_outputProperties.setUid(handler.nextUid()); 195 setPropertiesFromAttributes(handler, rawName, attributes, this); 196 197 // Access this only from the Hashtable level... we don't want to 198 // get default properties. 199 String entitiesFileName = 200 (String) m_outputProperties.getProperties().get(OutputPropertiesFactory.S_KEY_ENTITIES); 201 202 if (null != entitiesFileName) 203 { 204 try 205 { 206 String absURL = SystemIDResolver.getAbsoluteURI(entitiesFileName, 207 handler.getBaseIdentifier()); 208 m_outputProperties.getProperties().put(OutputPropertiesFactory.S_KEY_ENTITIES, absURL); 209 } 210 catch(TransformerException te) 211 { 212 handler.error(te.getMessage(), te); 213 } 214 } 215 216 handler.getStylesheet().setOutput(m_outputProperties); 217 218 ElemTemplateElement parent = handler.getElemTemplateElement(); 219 parent.appendChild(m_outputProperties); 220 221 m_outputProperties = null; 222 } 223 } 224