1 <!doctype html>
   2 <!--
   3 Copyright (c) 2000, 2005, Oracle and/or its affiliates. All rights reserved.
   4 DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   5 
   6 This code is free software; you can redistribute it and/or modify it
   7 under the terms of the GNU General Public License version 2 only, as
   8 published by the Free Software Foundation.  Oracle designates this
   9 particular file as subject to the "Classpath" exception as provided
  10 by Oracle in the LICENSE file that accompanied this code.
  11 
  12 This code is distributed in the hope that it will be useful, but WITHOUT
  13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  15 version 2 for more details (a copy is included in the LICENSE file that
  16 accompanied this code).
  17 
  18 You should have received a copy of the GNU General Public License version
  19 2 along with this work; if not, write to the Free Software Foundation,
  20 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  21 
  22 Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  23 or visit www.oracle.com if you need additional information or have any
  24 questions. 
  25 -->
  26 
  27 <html>
  28 
  29 <head>
  30   <title>javax.xml.transform</title>
  31 
  32   <meta name="CVS"
  33         content="$Id: package.html,v 1.2 2005/06/10 03:50:39 jeffsuttor Exp $" />
  34   <meta name="AUTHOR"
  35         content="Jeff.Suttor@Sun.com" />
  36 </head>
  37 
  38 <body>
  39 <p>This package defines the generic APIs for processing transformation
  40 instructions, and performing a transformation from source to result. These
  41 interfaces have no dependencies on SAX or the DOM standard, and try to make as
  42 few assumptions as possible about the details of the source and result of a
  43 transformation. It achieves this by defining
  44 {@link javax.xml.transform.Source} and
  45 {@link javax.xml.transform.Result} interfaces.
  46 </p>
  47 
  48 <p>To define concrete classes for the user, the API defines specializations
  49 of the interfaces found at the root level. These interfaces are found in
  50 {@link javax.xml.transform.sax}, {@link javax.xml.transform.dom},
  51 and {@link javax.xml.transform.stream}.
  52 </p>
  53 
  54 
  55 <h3>Creating Objects</h3>
  56 
  57 <p>The API allows a concrete
  58 {@link javax.xml.transform.TransformerFactory} object to be created from
  59 the static function
  60 {@link javax.xml.transform.TransformerFactory#newInstance}.
  61 </p>
  62 
  63 
  64 <h3>Specification of Inputs and Outputs</h3>
  65 
  66 <p>This API defines two interface objects called
  67 {@link javax.xml.transform.Source} and
  68 {@link javax.xml.transform.Result}. In order to pass Source and Result
  69 objects to the interfaces, concrete classes must be used.
  70 Three concrete representations are defined for each of these
  71 objects:
  72 {@link javax.xml.transform.stream.StreamSource} and
  73 {@link javax.xml.transform.stream.StreamResult},
  74 {@link javax.xml.transform.sax.SAXSource} and
  75 {@link javax.xml.transform.sax.SAXResult}, and
  76 {@link javax.xml.transform.dom.DOMSource} and
  77 {@link javax.xml.transform.dom.DOMResult}. Each of these objects defines
  78 a FEATURE string (which is i the form of a URL), which can be passed into
  79 {@link javax.xml.transform.TransformerFactory#getFeature} to see if the
  80 given type of Source or Result object is supported. For instance, to test if a
  81 DOMSource and a StreamResult is supported, you can apply the following
  82 test.
  83 </p>
  84 
  85 <pre>
  86 <code>
  87 TransformerFactory tfactory = TransformerFactory.newInstance();
  88 if (tfactory.getFeature(DOMSource.FEATURE) &amp;&amp; tfactory.getFeature(StreamResult.FEATURE)) {
  89 ...
  90 }
  91 </code>
  92 </pre>
  93 
  94 
  95 <h3>
  96 <a id="qname-delimiter">Qualified Name Representation</a>
  97 </h3>
  98 
  99 <p><a href="http://www.w3.org/TR/REC-xml-names">Namespaces</a>
 100 present something of a problem area when dealing with XML objects. Qualified
 101 Names appear in XML markup as prefixed names. But the prefixes themselves do
 102 not hold identity. Rather, it is the URIs that they contextually map to that
 103 hold the identity. Therefore, when passing a Qualified Name like "xyz:foo"
 104 among Java programs, one must provide a means to map "xyz" to a namespace.
 105 </p>
 106 
 107 <p>One solution has been to create a "QName" object that holds the
 108 namespace URI, as well as the prefix and local name, but this is not always an
 109 optimal solution, as when, for example, you want to use unique strings as keys
 110 in a dictionary object. Not having a string representation also makes it
 111 difficult to specify a namespaced identity outside the context of an XML
 112 document.
 113 </p>
 114 
 115 <p>In order to pass namespaced values to transformations,
 116 for 
 117 instance when setting a property or a parameter on a 
 118 {@link javax.xml.transform.Transformer} object,
 119 this specification defines that a
 120 String "qname" object parameter be passed as two-part string, the namespace URI
 121 enclosed in curly braces ({}), followed by the local name. If the qname has a
 122 null URI, then the String object only contains the local name. An application
 123 can safely check for a non-null URI by testing to see if the first character of
 124 the name is a '{' character.
 125 </p>
 126 
 127 <p>For example, if a URI and local name were obtained from an element
 128 defined with &lt;xyz:foo xmlns:xyz="http://xyz.foo.com/yada/baz.html"/&gt;,
 129 then the Qualified Name would be "{http://xyz.foo.com/yada/baz.html}foo".
 130 Note that the prefix is lost.
 131 </p>
 132 
 133 
 134 <h3>Result Tree Serialization</h3>
 135 
 136 <p>Serialization of the result tree to a stream can be controlled with
 137 the {@link javax.xml.transform.Transformer#setOutputProperties} and the
 138 {@link javax.xml.transform.Transformer#setOutputProperty} methods.
 139 These properties only apply to stream results, they have no effect when
 140 the result is a DOM tree or SAX event stream.</p>
 141 
 142 <p>Strings that match the <a href="http://www.w3.org/TR/xslt#output">XSLT
 143 specification for xsl:output attributes</a> can be referenced from the
 144 {@link javax.xml.transform.OutputKeys} class. Other strings can be
 145 specified as well.
 146 If the transformer does not recognize an output key, a
 147 {@link java.lang.IllegalArgumentException} is thrown, unless the
 148 key name is <a href="#qname-delimiter">namespace qualified</a>. Output key names
 149 that are namespace qualified are always allowed, although they may be
 150 ignored by some implementations.</p>
 151 
 152 <p>If all that is desired is the simple identity transformation of a
 153 source to a result, then {@link javax.xml.transform.TransformerFactory}
 154 provides a
 155 {@link javax.xml.transform.TransformerFactory#newTransformer()} method
 156 with no arguments. This method creates a Transformer that effectively copies
 157 the source to the result. This method may be used to create a DOM from SAX
 158 events or to create an XML or HTML stream from a DOM or SAX events.  </p>
 159 
 160 <h3>Exceptions and Error Reporting</h3>
 161 
 162 <p>The transformation API throw three types of specialized exceptions. A
 163 {@link javax.xml.transform.TransformerFactoryConfigurationError} is parallel to
 164 the {@link javax.xml.parsers.FactoryConfigurationError}, and is thrown
 165 when a configuration problem with the TransformerFactory exists. This error
 166 will typically be thrown when the transformation factory class specified with
 167 the "javax.xml.transform.TransformerFactory" system property cannot be found or
 168 instantiated.</p>
 169 
 170 <p>A {@link javax.xml.transform.TransformerConfigurationException}
 171 may be thrown if for any reason a Transformer can not be created. A
 172 TransformerConfigurationException may be thrown if there is a syntax error in
 173 the transformation instructions, for example when
 174 {@link javax.xml.transform.TransformerFactory#newTransformer} is
 175 called.</p>
 176 
 177 <p>{@link javax.xml.transform.TransformerException} is a general
 178 exception that occurs during the course of a transformation. A transformer
 179 exception may wrap another exception, and if any of the
 180 {@link javax.xml.transform.TransformerException#printStackTrace()}
 181 methods are called on it, it will produce a list of stack dumps, starting from
 182 the most recent. The transformer exception also provides a
 183 {@link javax.xml.transform.SourceLocator} object which indicates where
 184 in the source tree or transformation instructions the error occurred.
 185 {@link javax.xml.transform.TransformerException#getMessageAndLocation()}
 186 may be called to get an error message with location info, and
 187 {@link javax.xml.transform.TransformerException#getLocationAsString()}
 188 may be called to get just the location string.</p>
 189 
 190 <p>Transformation warnings and errors are sent to an
 191 {@link javax.xml.transform.ErrorListener}, at which point the
 192 application may decide to report the error or warning, and may decide to throw
 193 an <code>Exception</code> for a non-fatal error. The <code>ErrorListener</code> may be set via
 194 {@link javax.xml.transform.TransformerFactory#setErrorListener} for
 195 reporting errors that have to do with syntax errors in the transformation
 196 instructions, or via
 197 {@link javax.xml.transform.Transformer#setErrorListener} to report
 198 errors that occur during the transformation. The <code>ErrorListener</code> on both objects
 199 will always be valid and non-<code>null</code>, whether set by the application or a default
 200 implementation provided by the processor.
 201 The default implementation provided by the processor will report all warnings and errors to <code>System.err</code>
 202 and does not throw any <code>Exception</code>s.
 203 Applications are <em>strongly</em> encouraged to register and use
 204 <code>ErrorListener</code>s that insure proper behavior for warnings and
 205 errors.
 206 </p>
 207 
 208 
 209 <h3>Resolution of URIs within a transformation</h3>
 210 
 211 <p>The API provides a way for URIs referenced from within the stylesheet
 212 instructions or within the transformation to be resolved by the calling
 213 application. This can be done by creating a class that implements the
 214 {@link javax.xml.transform.URIResolver} interface, with its one method,
 215 {@link javax.xml.transform.URIResolver#resolve}, and use this class to
 216 set the URI resolution for the transformation instructions or transformation
 217 with {@link javax.xml.transform.TransformerFactory#setURIResolver} or
 218 {@link javax.xml.transform.Transformer#setURIResolver}. The
 219 <code>URIResolver.resolve</code> method takes two String arguments, the URI found in the
 220 stylesheet instructions or built as part of the transformation process, and the
 221 base URI 
 222 against which the first argument will be made absolute if the
 223 absolute URI is required.
 224 The returned {@link javax.xml.transform.Source} object must be usable by
 225 the transformer, as specified in its implemented features.</p>
 226 
 227 
 228 </body>
 229 </html>