This commit was manufactured by cvs2svn to create tag
'xalan-j_2_2_D05'.
git-svn-id: https://svn.apache.org/repos/asf/xalan/java/tags/xalan-j_2_2_D05@335122 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/org/apache/xalan/xsltc/trax/TrAXFilter.java b/src/org/apache/xalan/xsltc/trax/TrAXFilter.java
deleted file mode 100644
index f721208..0000000
--- a/src/org/apache/xalan/xsltc/trax/TrAXFilter.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * @(#)$Id$
- *
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 2001 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 2001, Sun
- * Microsystems., http://www.sun.com. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- * @author G. Todd Miller
- *
- */
-
-
-package org.apache.xalan.xsltc.trax;
-
-import org.xml.sax.XMLFilter;
-import org.xml.sax.helpers.XMLFilterImpl;
-import javax.xml.transform.Templates;
-import javax.xml.transform.TransformerConfigurationException;
-
-
-/**
- * skeleton extension of XMLFilterImpl for now.
- */
-public class TrAXFilter extends XMLFilterImpl {
- public TrAXFilter(Templates templates) throws
- TransformerConfigurationException
- {
- /* nothing yet */
- }
-}
diff --git a/src/org/apache/xalan/xsltc/trax/TransformerFactoryImpl.java b/src/org/apache/xalan/xsltc/trax/TransformerFactoryImpl.java
deleted file mode 100644
index 46b9564..0000000
--- a/src/org/apache/xalan/xsltc/trax/TransformerFactoryImpl.java
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- * @(#)$Id$
- *
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 2001 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 2001, Sun
- * Microsystems., http://www.sun.com. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- * @author G. Todd Miller
- *
- */
-
-
-package org.apache.xalan.xsltc.trax;
-
-import javax.xml.transform.Templates;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.ErrorListener;
-import javax.xml.transform.Source;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.URIResolver;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TemplatesHandler;
-import javax.xml.transform.sax.TransformerHandler;
-
-import org.xml.sax.XMLFilter;
-
-import org.apache.xalan.xsltc.Translet;
-import org.apache.xalan.xsltc.compiler.XSLTC;
-import org.apache.xalan.xsltc.compiler.CompilerException;
-import org.apache.xalan.xsltc.compiler.util.Util;
-import org.apache.xalan.xsltc.runtime.AbstractTranslet;
-
-import java.io.File;
-import java.io.InputStream;
-import java.net.URL;
-import java.net.MalformedURLException;
-
-
-/**
- * Implementation of a JAXP1.1 SAXTransformerFactory for Translets.
- */
-public class TransformerFactoryImpl extends SAXTransformerFactory {
- public TransformerFactoryImpl() { /* nothing yet */ }
-
- //////////////////////////////////////////////////////
- // SAXTransformerFactory (subclass of TransformerFactory)
- //
- public TemplatesHandler newTemplatesHandler()
- throws TransformerConfigurationException
- {
- /*TBD*/
- throw new TransformerConfigurationException(
- "TransformerFactoryImpl:newTemplatesHandler() " +
- "not implemented yet.");
- //return null;
- }
- public TransformerHandler newTransformerHandler()
- throws TransformerConfigurationException
- {
- /*TBD*/
- throw new TransformerConfigurationException(
- "TransformerFactoryImpl:newTransformerHandler() " +
- "not implemented yet.");
- // return null;
- }
- public TransformerHandler newTransformerHandler(Source src)
- throws TransformerConfigurationException
- {
- /*TBD*/
- throw new TransformerConfigurationException(
- "TransformerFactoryImpl:newTransformerHandler(Source) " +
- "not implemented yet.");
- // return null;
- }
- public TransformerHandler newTransformerHandler(Templates templates)
- throws TransformerConfigurationException
- {
- /*TBD*/
- throw new TransformerConfigurationException(
- "TransformerFactoryImpl:newTransformerHandler(Templates) " +
- "not implemented yet.");
- //return null;
- }
-
-
- /**
- * Create an XMLFilter that uses the given source as the
- * transformation instructions.
- *
- * @param src The source of the transformation instructions.
- *
- * @return An XMLFilter object, or null if this feature is not supported.
- *
- * @throws TransformerConfigurationException
- */
- public XMLFilter newXMLFilter(Source src)
- throws TransformerConfigurationException
- {
- Templates templates = newTemplates(src);
- if (templates == null ) {
- return null;
- }
- return newXMLFilter(templates);
- }
-
- public XMLFilter newXMLFilter(Templates templates)
- throws TransformerConfigurationException
- {
- try {
- return new org.apache.xalan.xsltc.trax.TrAXFilter(templates);
- } catch( TransformerConfigurationException ex ) {
- if( _errorListener != null) {
- try {
- _errorListener.fatalError( ex );
- return null;
- } catch( TransformerException ex1 ) {
- new TransformerConfigurationException(ex1);
- }
- }
- throw ex;
- }
- }
- //
- // End SAXTransformerFactory methods
- //////////////////////////////////////////////////////
-
- //////////////////////////////////////////////////////
- // TransformerFactory
- //
- public ErrorListener getErrorListener() {
- return _errorListener;
- }
-
- public void setErrorListener(ErrorListener listener)
- throws IllegalArgumentException
- {
- if (listener == null) {
- throw new IllegalArgumentException(
- "Error: setErrorListener() call where ErrorListener is null");
- }
- _errorListener = listener;
- }
-
- public Object getAttribute(String name)
- throws IllegalArgumentException
- {
- /*TBD*/
- throw new IllegalArgumentException(
- "TransformerFactoryImpl:getAttribute(String) " +
- "not implemented yet.");
- //return null;
- }
- public void setAttribute(String name, Object value)
- throws IllegalArgumentException
- {
- /*TBD*/
- throw new IllegalArgumentException(
- "TransformerFactoryImpl:getAttribute(String) " +
- "not implemented yet.");
- }
- public boolean getFeature(String name) {
- if ((StreamSource.FEATURE == name) ||
- (StreamResult.FEATURE == name) ||
- (SAXTransformerFactory.FEATURE == name)) {
- return true;
- } else if ((StreamSource.FEATURE.equals(name))
- || (StreamResult.FEATURE.equals(name))
- || (SAXTransformerFactory.FEATURE.equals(name))) {
- return true;
- } else {
- return false;
- }
- }
- public URIResolver getURIResolver() { /*TBD*/ return null; }
- public void setURIResolver(URIResolver resolver) {/*TBD*/ }
- public Source getAssociatedStylesheet(Source src, String media,
- String title, String charset) throws TransformerConfigurationException
- {
- /*TBD*/
- throw new TransformerConfigurationException(
- "TransformerFactoryImpl:getAssociatedStylesheet(Source,String," +
- "String, String) not implemented yet.");
- //return null;
- }
- public Transformer newTransformer() throws
- TransformerConfigurationException
- {
- /*TBD*/
- throw new TransformerConfigurationException(
- "TransformerFactoryImpl:newTransformer() " +
- " not implemented yet.");
- //return null;
- }
- //
- // End TransformerFactory methods
- //////////////////////////////////////////////////////
-
-
- public Transformer newTransformer(Source stylesheet) throws
- TransformerConfigurationException
- {
- XSLTC xsltc = new XSLTC();
- xsltc.init();
-
- // check if destination has been set with system property
- String transletDestDir = System.getProperty("transletPool");
- if (transletDestDir != null) {
- try {
- xsltc.setDestDirectory(transletDestDir);
- } catch(CompilerException e) {
- throw new TransformerConfigurationException(
- "System property 'transletPool' was set to " +
- transletDestDir + ", " + e );
- }
- }
-
- // compile stylesheet
- boolean isSuccessful = true;
- StreamSource strmsrc = (StreamSource)stylesheet;
- InputStream inputStream = strmsrc.getInputStream();
- String stylesheetName = stylesheet.getSystemId();
- String transletName = "no_name";
- if (inputStream != null) {
- isSuccessful = xsltc.compile(inputStream, transletName);
- } else if (stylesheetName != null ){
- transletName = Util.toJavaName(Util.noExtName(
- Util.baseName(stylesheetName)));
- try {
- if (stylesheetName.startsWith("file:/")) {
- isSuccessful = xsltc.compile(new URL(stylesheetName));
- } else {
- File file = new File(stylesheetName);
- URL url = file.toURL();
- isSuccessful = xsltc.compile(url);
- }
- } catch (MalformedURLException e) {
- throw new TransformerConfigurationException(
- "URL for stylesheet '" + stylesheetName +
- "' can not be formed.");
- }
- } else {
- throw new TransformerConfigurationException(
- "Stylesheet must have a system id or be an InputStream.");
- }
-
- if (!isSuccessful) {
- throw new TransformerConfigurationException(
- "Compilation of stylesheet '" + stylesheetName + "' failed.");
- }
-
- Translet translet = null;
- try {
- Class clazz = Class.forName(transletName);
- translet = (Translet)clazz.newInstance();
- ((AbstractTranslet)translet).setTransletName(transletName);
- // GTM
- if (_errorListener != null) {
- ((AbstractTranslet)translet).setErrorListener(_errorListener);
- }
- } catch (ClassNotFoundException e) {
- throw new TransformerConfigurationException(
- "Translet class '" + transletName + "' not found.");
- } catch (InstantiationException e) {
- throw new TransformerConfigurationException(
- "Translet class '" + transletName +
- "' could not be instantiated");
- } catch (IllegalAccessException e) {
- throw new TransformerConfigurationException(
- "Translet class '" + transletName + "' could not be accessed.");
- }
- return (AbstractTranslet)translet;
- }
-
- public Templates newTemplates(Source stylesheet) throws
- TransformerConfigurationException
- {
- return new TransletTemplates(stylesheet);
- }
-
- private ErrorListener _errorListener = null;
-}
diff --git a/src/org/apache/xalan/xsltc/trax/TransletTemplates.java b/src/org/apache/xalan/xsltc/trax/TransletTemplates.java
deleted file mode 100644
index 354072c..0000000
--- a/src/org/apache/xalan/xsltc/trax/TransletTemplates.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * @(#)$Id$
- *
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 2001 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 2001, Sun
- * Microsystems., http://www.sun.com. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- * @author G. Todd Miller
- *
- */
-package org.apache.xalan.xsltc.trax;
-
-import javax.xml.transform.Templates;
-import javax.xml.transform.Source;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.sax.SAXTransformerFactory;
-
-import org.apache.xalan.xsltc.runtime.AbstractTranslet;
-import org.apache.xalan.xsltc.compiler.XSLTC;
-import org.apache.xalan.xsltc.compiler.CompilerException;
-import org.apache.xalan.xsltc.compiler.util.Util;
-import org.apache.xalan.xsltc.Translet;
-import java.util.Properties;
-
-import java.io.File;
-import java.io.InputStream;
-import java.net.URL;
-import java.net.MalformedURLException;
-
-/**
- * Implementation of a JAXP1.1 Templates object for Translets.
- */
-public class TransletTemplates implements Templates {
- private Source _stylesheet;
-
- public TransletTemplates(Source stylesheet) {
- _stylesheet = stylesheet;
- }
-
- public Transformer newTransformer() throws
- TransformerConfigurationException
- {
- XSLTC xsltc = new XSLTC();
- xsltc.init();
-
- // check if destination has been set with system property
- String transletDestDir = System.getProperty("transletPool");
- if (transletDestDir != null) {
- try {
- xsltc.setDestDirectory(transletDestDir);
- } catch(CompilerException e) {
- throw new TransformerConfigurationException(
- "System property 'transletPool' was set to " +
- transletDestDir + ", " + e );
- }
- }
-
-
- // compile stylesheet
- boolean isSuccessful = true;
- StreamSource strmsrc = (StreamSource)_stylesheet;
- InputStream inputStream = strmsrc.getInputStream();
- String stylesheetName = _stylesheet.getSystemId();
- String transletName = "no_name";
- if (inputStream != null) {
- isSuccessful = xsltc.compile(inputStream, transletName);
- } else if (stylesheetName != null ){
-/******************
- int index = stylesheetName.indexOf('.');
- if (index > 0) {
- transletName = stylesheetName.substring(0,index);
- }
- else {
- // indexOf returns -1 if '.' is not present
- transletName = stylesheetName;
- }
-********************/
- transletName = Util.toJavaName(Util.noExtName(
- Util.baseName(stylesheetName)));
- try {
- if (stylesheetName.startsWith("file:/")) {
- isSuccessful = xsltc.compile(new URL(stylesheetName));
- } else {
- File file = new File(stylesheetName);
- URL url = file.toURL();
- isSuccessful = xsltc.compile(url);
- }
- } catch (MalformedURLException e) {
- throw new TransformerConfigurationException(
- "URL for stylesheet '" + stylesheetName +
- "' can not be formed.");
- }
- } else {
- throw new TransformerConfigurationException(
- "Stylesheet must have a system id or be an InputStream.");
- }
-
- if (!isSuccessful) {
- throw new TransformerConfigurationException(
- "Compilation of stylesheet '" + stylesheetName + "' failed.");
- }
-
- Translet translet = null;
- try {
- Class clazz = Class.forName(transletName);
- translet = (Translet)clazz.newInstance();
- ((AbstractTranslet)translet).setTransletName(transletName);
- } catch (ClassNotFoundException e) {
- throw new TransformerConfigurationException(
- "Translet class '" + transletName + "' not found.");
- } catch (InstantiationException e) {
- throw new TransformerConfigurationException(
- "Translet class '" + transletName +
- "' could not be instantiated");
- } catch (IllegalAccessException e) {
- throw new TransformerConfigurationException(
- "Translet class '" + transletName + "' could not be accessed.");
- }
- return (AbstractTranslet)translet;
- }
-
- public Properties getOutputProperties() {
- /*TBD*/
- return new Properties();
- }
-
-}
diff --git a/src/org/w3c/dom/ranges/DocumentRange.java b/src/org/w3c/dom/ranges/DocumentRange.java
deleted file mode 100644
index 6b52267..0000000
--- a/src/org/w3c/dom/ranges/DocumentRange.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (c) 2000 World Wide Web Consortium,
- * (Massachusetts Institute of Technology, Institut National de
- * Recherche en Informatique et en Automatique, Keio University). All
- * Rights Reserved. This program is distributed under the W3C's Software
- * Intellectual Property License. This program is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.
- * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
- */
-
-package org.w3c.dom.ranges;
-
-/**
- * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113'>Document Object Model (DOM) Level 2 Traversal and Range Specification</a>.
- * @since DOM Level 2
- */
-public interface DocumentRange {
- /**
- * This interface can be obtained from the object implementing the
- * <code>Document</code> interface using binding-specific casting
- * methods.
- * @return The initial state of the Range returned from this method is
- * such that both of its boundary-points are positioned at the
- * beginning of the corresponding Document, before any content. The
- * Range returned can only be used to select content associated with
- * this Document, or with DocumentFragments and Attrs for which this
- * Document is the <code>ownerDocument</code>.
- */
- public Range createRange();
-
-}
diff --git a/src/org/w3c/dom/ranges/Range.java b/src/org/w3c/dom/ranges/Range.java
deleted file mode 100644
index 7743abe..0000000
--- a/src/org/w3c/dom/ranges/Range.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * Copyright (c) 2000 World Wide Web Consortium,
- * (Massachusetts Institute of Technology, Institut National de
- * Recherche en Informatique et en Automatique, Keio University). All
- * Rights Reserved. This program is distributed under the W3C's Software
- * Intellectual Property License. This program is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.
- * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
- */
-
-package org.w3c.dom.ranges;
-
-import org.w3c.dom.Node;
-import org.w3c.dom.DocumentFragment;
-import org.w3c.dom.DOMException;
-
-/**
- * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113'>Document Object Model (DOM) Level 2 Traversal and Range Specification</a>.
- * @since DOM Level 2
- */
-public interface Range {
- /**
- * Node within which the Range begins
- * @exception DOMException
- * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
- * invoked on this object.
- */
- public Node getStartContainer()
- throws DOMException;
-
- /**
- * Offset within the starting node of the Range.
- * @exception DOMException
- * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
- * invoked on this object.
- */
- public int getStartOffset()
- throws DOMException;
-
- /**
- * Node within which the Range ends
- * @exception DOMException
- * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
- * invoked on this object.
- */
- public Node getEndContainer()
- throws DOMException;
-
- /**
- * Offset within the ending node of the Range.
- * @exception DOMException
- * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
- * invoked on this object.
- */
- public int getEndOffset()
- throws DOMException;
-
- /**
- * TRUE if the Range is collapsed
- * @exception DOMException
- * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
- * invoked on this object.
- */
- public boolean getCollapsed()
- throws DOMException;
-
- /**
- * The deepest common ancestor container of the Range's two
- * boundary-points.
- * @exception DOMException
- * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
- * invoked on this object.
- */
- public Node getCommonAncestorContainer()
- throws DOMException;
-
- /**
- * Sets the attributes describing the start of the Range.
- * @param refNodeThe <code>refNode</code> value. This parameter must be
- * different from <code>null</code>.
- * @param offsetThe <code>startOffset</code> value.
- * @exception RangeException
- * INVALID_NODE_TYPE_ERR: Raised if <code>refNode</code> or an ancestor
- * of <code>refNode</code> is an Entity, Notation, or DocumentType
- * node.
- * @exception DOMException
- * INDEX_SIZE_ERR: Raised if <code>offset</code> is negative or greater
- * than the number of child units in <code>refNode</code>. Child units
- * are 16-bit units if <code>refNode</code> is a type of CharacterData
- * node (e.g., a Text or Comment node) or a ProcessingInstruction
- * node. Child units are Nodes in all other cases.
- * <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
- * been invoked on this object.
- */
- public void setStart(Node refNode,
- int offset)
- throws RangeException, DOMException;
-
- /**
- * Sets the attributes describing the end of a Range.
- * @param refNodeThe <code>refNode</code> value. This parameter must be
- * different from <code>null</code>.
- * @param offsetThe <code>endOffset</code> value.
- * @exception RangeException
- * INVALID_NODE_TYPE_ERR: Raised if <code>refNode</code> or an ancestor
- * of <code>refNode</code> is an Entity, Notation, or DocumentType
- * node.
- * @exception DOMException
- * INDEX_SIZE_ERR: Raised if <code>offset</code> is negative or greater
- * than the number of child units in <code>refNode</code>. Child units
- * are 16-bit units if <code>refNode</code> is a type of CharacterData
- * node (e.g., a Text or Comment node) or a ProcessingInstruction
- * node. Child units are Nodes in all other cases.
- * <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
- * been invoked on this object.
- */
- public void setEnd(Node refNode,
- int offset)
- throws RangeException, DOMException;
-
- /**
- * Sets the start position to be before a node
- * @param refNodeRange starts before <code>refNode</code>
- * @exception RangeException
- * INVALID_NODE_TYPE_ERR: Raised if the root container of
- * <code>refNode</code> is not an Attr, Document, or DocumentFragment
- * node or if <code>refNode</code> is a Document, DocumentFragment,
- * Attr, Entity, or Notation node.
- * @exception DOMException
- * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
- * invoked on this object.
- */
- public void setStartBefore(Node refNode)
- throws RangeException, DOMException;
-
- /**
- * Sets the start position to be after a node
- * @param refNodeRange starts after <code>refNode</code>
- * @exception RangeException
- * INVALID_NODE_TYPE_ERR: Raised if the root container of
- * <code>refNode</code> is not an Attr, Document, or DocumentFragment
- * node or if <code>refNode</code> is a Document, DocumentFragment,
- * Attr, Entity, or Notation node.
- * @exception DOMException
- * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
- * invoked on this object.
- */
- public void setStartAfter(Node refNode)
- throws RangeException, DOMException;
-
- /**
- * Sets the end position to be before a node.
- * @param refNodeRange ends before <code>refNode</code>
- * @exception RangeException
- * INVALID_NODE_TYPE_ERR: Raised if the root container of
- * <code>refNode</code> is not an Attr, Document, or DocumentFragment
- * node or if <code>refNode</code> is a Document, DocumentFragment,
- * Attr, Entity, or Notation node.
- * @exception DOMException
- * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
- * invoked on this object.
- */
- public void setEndBefore(Node refNode)
- throws RangeException, DOMException;
-
- /**
- * Sets the end of a Range to be after a node
- * @param refNodeRange ends after <code>refNode</code>.
- * @exception RangeException
- * INVALID_NODE_TYPE_ERR: Raised if the root container of
- * <code>refNode</code> is not an Attr, Document or DocumentFragment
- * node or if <code>refNode</code> is a Document, DocumentFragment,
- * Attr, Entity, or Notation node.
- * @exception DOMException
- * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
- * invoked on this object.
- */
- public void setEndAfter(Node refNode)
- throws RangeException, DOMException;
-
- /**
- * Collapse a Range onto one of its boundary-points
- * @param toStartIf TRUE, collapses the Range onto its start; if FALSE,
- * collapses it onto its end.
- * @exception DOMException
- * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
- * invoked on this object.
- */
- public void collapse(boolean toStart)
- throws DOMException;
-
- /**
- * Select a node and its contents
- * @param refNodeThe node to select.
- * @exception RangeException
- * INVALID_NODE_TYPE_ERR: Raised if an ancestor of <code>refNode</code>
- * is an Entity, Notation or DocumentType node or if
- * <code>refNode</code> is a Document, DocumentFragment, Attr, Entity,
- * or Notation node.
- * @exception DOMException
- * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
- * invoked on this object.
- */
- public void selectNode(Node refNode)
- throws RangeException, DOMException;
-
- /**
- * Select the contents within a node
- * @param refNodeNode to select from
- * @exception RangeException
- * INVALID_NODE_TYPE_ERR: Raised if <code>refNode</code> or an ancestor
- * of <code>refNode</code> is an Entity, Notation or DocumentType node.
- * @exception DOMException
- * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
- * invoked on this object.
- */
- public void selectNodeContents(Node refNode)
- throws RangeException, DOMException;
-
- // CompareHow
- /**
- * Compare start boundary-point of <code>sourceRange</code> to start
- * boundary-point of Range on which <code>compareBoundaryPoints</code>
- * is invoked.
- */
- public static final short START_TO_START = 0;
- /**
- * Compare start boundary-point of <code>sourceRange</code> to end
- * boundary-point of Range on which <code>compareBoundaryPoints</code>
- * is invoked.
- */
- public static final short START_TO_END = 1;
- /**
- * Compare end boundary-point of <code>sourceRange</code> to end
- * boundary-point of Range on which <code>compareBoundaryPoints</code>
- * is invoked.
- */
- public static final short END_TO_END = 2;
- /**
- * Compare end boundary-point of <code>sourceRange</code> to start
- * boundary-point of Range on which <code>compareBoundaryPoints</code>
- * is invoked.
- */
- public static final short END_TO_START = 3;
-
- /**
- * Compare the boundary-points of two Ranges in a document.
- * @param howA code representing the type of comparison, as defined above.
- * @param sourceRangeThe <code>Range</code> on which this current
- * <code>Range</code> is compared to.
- * @return -1, 0 or 1 depending on whether the corresponding
- * boundary-point of the Range is respectively before, equal to, or
- * after the corresponding boundary-point of <code>sourceRange</code>.
- * @exception DOMException
- * WRONG_DOCUMENT_ERR: Raised if the two Ranges are not in the same
- * Document or DocumentFragment.
- * <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
- * been invoked on this object.
- */
- public short compareBoundaryPoints(short how,
- Range sourceRange)
- throws DOMException;
-
- /**
- * Removes the contents of a Range from the containing document or
- * document fragment without returning a reference to the removed
- * content.
- * @exception DOMException
- * NO_MODIFICATION_ALLOWED_ERR: Raised if any portion of the content of
- * the Range is read-only or any of the nodes that contain any of the
- * content of the Range are read-only.
- * <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
- * been invoked on this object.
- */
- public void deleteContents()
- throws DOMException;
-
- /**
- * Moves the contents of a Range from the containing document or document
- * fragment to a new DocumentFragment.
- * @return A DocumentFragment containing the extracted contents.
- * @exception DOMException
- * NO_MODIFICATION_ALLOWED_ERR: Raised if any portion of the content of
- * the Range is read-only or any of the nodes which contain any of the
- * content of the Range are read-only.
- * <br>HIERARCHY_REQUEST_ERR: Raised if a DocumentType node would be
- * extracted into the new DocumentFragment.
- * <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
- * been invoked on this object.
- */
- public DocumentFragment extractContents()
- throws DOMException;
-
- /**
- * Duplicates the contents of a Range
- * @return A DocumentFragment that contains content equivalent to this
- * Range.
- * @exception DOMException
- * HIERARCHY_REQUEST_ERR: Raised if a DocumentType node would be
- * extracted into the new DocumentFragment.
- * <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
- * been invoked on this object.
- */
- public DocumentFragment cloneContents()
- throws DOMException;
-
- /**
- * Inserts a node into the Document or DocumentFragment at the start of
- * the Range. If the container is a Text node, this will be split at the
- * start of the Range (as if the Text node's splitText method was
- * performed at the insertion point) and the insertion will occur
- * between the two resulting Text nodes. Adjacent Text nodes will not be
- * automatically merged. If the node to be inserted is a
- * DocumentFragment node, the children will be inserted rather than the
- * DocumentFragment node itself.
- * @param newNodeThe node to insert at the start of the Range
- * @exception DOMException
- * NO_MODIFICATION_ALLOWED_ERR: Raised if an ancestor container of the
- * start of the Range is read-only.
- * <br>WRONG_DOCUMENT_ERR: Raised if <code>newNode</code> and the
- * container of the start of the Range were not created from the same
- * document.
- * <br>HIERARCHY_REQUEST_ERR: Raised if the container of the start of
- * the Range is of a type that does not allow children of the type of
- * <code>newNode</code> or if <code>newNode</code> is an ancestor of
- * the container.
- * <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
- * been invoked on this object.
- * @exception RangeException
- * INVALID_NODE_TYPE_ERR: Raised if <code>newNode</code> is an Attr,
- * Entity, Notation, or Document node.
- */
- public void insertNode(Node newNode)
- throws DOMException, RangeException;
-
- /**
- * Reparents the contents of the Range to the given node and inserts the
- * node at the position of the start of the Range.
- * @param newParentThe node to surround the contents with.
- * @exception DOMException
- * NO_MODIFICATION_ALLOWED_ERR: Raised if an ancestor container of
- * either boundary-point of the Range is read-only.
- * <br>WRONG_DOCUMENT_ERR: Raised if <code> newParent</code> and the
- * container of the start of the Range were not created from the same
- * document.
- * <br>HIERARCHY_REQUEST_ERR: Raised if the container of the start of
- * the Range is of a type that does not allow children of the type of
- * <code>newParent</code> or if <code>newParent</code> is an ancestor
- * of the container or if <code>node</code> would end up with a child
- * node of a type not allowed by the type of <code>node</code>.
- * <br>INVALID_STATE_ERR: Raised if <code>detach()</code> has already
- * been invoked on this object.
- * @exception RangeException
- * BAD_BOUNDARYPOINTS_ERR: Raised if the Range partially selects a
- * non-text node.
- * <br>INVALID_NODE_TYPE_ERR: Raised if <code> node</code> is an Attr,
- * Entity, DocumentType, Notation, Document, or DocumentFragment node.
- */
- public void surroundContents(Node newParent)
- throws DOMException, RangeException;
-
- /**
- * Produces a new Range whose boundary-points are equal to the
- * boundary-points of the Range.
- * @return The duplicated Range.
- * @exception DOMException
- * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
- * invoked on this object.
- */
- public Range cloneRange()
- throws DOMException;
-
- /**
- * Returns the contents of a Range as a string. This string contains only
- * the data characters, not any markup.
- * @return The contents of the Range.
- * @exception DOMException
- * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
- * invoked on this object.
- */
- public String toString()
- throws DOMException;
-
- /**
- * Called to indicate that the Range is no longer in use and that the
- * implementation may relinquish any resources associated with this
- * Range. Subsequent calls to any methods or attribute getters on this
- * Range will result in a <code>DOMException</code> being thrown with an
- * error code of <code>INVALID_STATE_ERR</code>.
- * @exception DOMException
- * INVALID_STATE_ERR: Raised if <code>detach()</code> has already been
- * invoked on this object.
- */
- public void detach()
- throws DOMException;
-
-}
diff --git a/src/org/w3c/dom/ranges/RangeException.java b/src/org/w3c/dom/ranges/RangeException.java
deleted file mode 100644
index 551008e..0000000
--- a/src/org/w3c/dom/ranges/RangeException.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2000 World Wide Web Consortium,
- * (Massachusetts Institute of Technology, Institut National de
- * Recherche en Informatique et en Automatique, Keio University). All
- * Rights Reserved. This program is distributed under the W3C's Software
- * Intellectual Property License. This program is distributed in the
- * hope that it will be useful, but WITHOUT ANY WARRANTY; without even
- * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE.
- * See W3C License http://www.w3.org/Consortium/Legal/ for more details.
- */
-
-package org.w3c.dom.ranges;
-
-/**
- * Range operations may throw a <code>RangeException</code> as specified in
- * their method descriptions.
- * <p>See also the <a href='http://www.w3.org/TR/2000/REC-DOM-Level-2-Traversal-Range-20001113'>Document Object Model (DOM) Level 2 Traversal and Range Specification</a>.
- * @since DOM Level 2
- */
-public class RangeException extends RuntimeException {
- public RangeException(short code, String message) {
- super(message);
- this.code = code;
- }
- public short code;
- // RangeExceptionCode
- /**
- * If the boundary-points of a Range do not meet specific requirements.
- */
- public static final short BAD_BOUNDARYPOINTS_ERR = 1;
- /**
- * If the container of an boundary-point of a Range is being set to either
- * a node of an invalid type or a node with an ancestor of an invalid
- * type.
- */
- public static final short INVALID_NODE_TYPE_ERR = 2;
-
-}
diff --git a/src/org/w3c/dom/ranges/package.html b/src/org/w3c/dom/ranges/package.html
deleted file mode 100644
index 8b9d80f..0000000
--- a/src/org/w3c/dom/ranges/package.html
+++ /dev/null
@@ -1,8 +0,0 @@
-<html>
- <title>org.w3c.dom.ranges Package</title>
- <body>
- <p>DOM level 2 range interfaces.<p>
- </body>
-</html>
-
-
diff --git a/src/trax/trax.properties b/src/trax/trax.properties
deleted file mode 100644
index e593c39..0000000
--- a/src/trax/trax.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-# $Revision$ $Date$
-#
-# Note: This properties file is provided for illustrative purposes
-# only and is not part of the interface definition.
-# This properties file is located in the implementation JAR
-# and different implementations will specify different
-# implementation classes and output methods.
-#
-
-# The TRaX Stylesheet processor
-trax.processor.xslt=org.apache.xalan.processor.StylesheetProcessor
diff --git a/xdocs/sources/xsltc/DOMInterface.gif b/xdocs/sources/xsltc/DOMInterface.gif
deleted file mode 100644
index 8f8919e..0000000
--- a/xdocs/sources/xsltc/DOMInterface.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/DOMLocking.gif b/xdocs/sources/xsltc/DOMLocking.gif
deleted file mode 100644
index cae33b4..0000000
--- a/xdocs/sources/xsltc/DOMLocking.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/README b/xdocs/sources/xsltc/README
deleted file mode 100644
index e7b498e..0000000
--- a/xdocs/sources/xsltc/README
+++ /dev/null
@@ -1,246 +0,0 @@
-=======================================================================
- README FILE FOR THE SUN XSLT COMPILER
- Preview Version 6
- April, 2001
- Copyright (c) Sun Microsystems, 2001
-=======================================================================
-
-The Sun XSLT Compiler (XSLTC) is a Java-based tool for compiling XSL
-stylesheets into extremely lightweight and portable Java byte code.
-The Sun XSLTC Java Runtime environment can then process XML files
-against these compiled stylesheets (Translets) to generate any manner
-of output per the style-sheet instructions.
-
-This preview version of the XSLT Compiler can be run on any
-platform -- including UNIX, Windows, NT, Mac -- that supports
-Java2 or later. The Translets (compiled stylesheets) can be run on any
-Java platform including a Palm Pilot with J2ME CLDC
-(Java 2 Micro Edition, Connected Limited Device Configuration).
-While the compiler itself requires Java2,translets are designed to run
-anywhere Java is available.
-
-Almost all functions of the XLST 1.0 language are implemented;
-more than enough to show you how this new approach to XSLT works
-and its advantages! Using the samples provided, you will be able
-to see for yourself. Also, demos for the Palm Pilot, Applets, and
-Servlets are provided.
-
------------------------------------------------------------------------
-ATTRIBUTIONS
------------------------------------------------------------------------
-The XSLT Compiler program uses the CUP Parser Generator
-for Java, Copyright 1996-1999 by Scott Hudson, Frank Flannery,
-C. Scott Ananian. For more details, please see:
-http://www.cs.princeton.edu/~appel/modern/java/CUP/
-
-The XSLT Compiler program also uses a modified version of the
-Byte Code Engineering Library (BCEL), formerly known as
-(JavaClass API), Copyright 2000 Markus Dahm.
-
-** Please note that this additional package, BCEL, is
-** needed in order to generate the class files from the compiler.
-** Without the BCEL package, this preview version of the
-** compiler WILL NOT WORK. BCEL is freely available for
-** download as described below.
-
------------------------------------------------------------------------
-REQUIRED PACKAGE
------------------------------------------------------------------------
-BCEL (formerly JavaClass) by Markus Dahm has been
-used to automatically create class files from the XSLT compiler output.
-You must obtain the BCEL.jar file and install it before using the
-XSLT compiler.
-
-The simplest way to download the BCEL.jar file from
-
- http://bcel.sourceforge.net/downloads.html
-
-is to use the "JAR file (without docs)" link.
-
-You may want to obtain the precompiled class files and documentation.
-To download them to a Unix system:
-
- 1) Choose the "latest version (Precompiled + docs)"
- Gzipped Tar-File or ZIP-File link.
-
- 2) Unpack and expand the downloaded BCEL files in your
- download directory (e.g., /usr/local).
-
- 3) Change directory to BCEL.
-
- 4) Create the jar file BCEL.jar.
-
- From within the BCEL directory, you can either use the
- included GNUmakefile or create the jar yourself.
-
- To use the GNUmakefile, type the command 'make jar'.
-
- To create the jar yourself, type the command:
-
- jar cvf BCEL.jar `find de gnu -name \*.class` listclass.class
-
-To download the precompiled class files and documentation
-to a Windows system:
-
- 1) Choose the "latest version (Precompiled + docs)"
- ZIP-File link.
-
- 2) Unzip the downloaded BCEL files in your
- download directory.
-
- 3) Change directory to BCEL and from a DOS command line,
- type the command:
-
- jar -cvf BCEL.jar de\fub\bytecode\classfile\*.class
- gnu\regexp\*.class listclass.class
-
-To complete the BCEL setup:
-
- 1) Install XSLTC, as described in the section below,
- "HOW TO INSTALL XSLTC AND RUN THE SAMPLES."
-
- 2) Copy the BCEL.jar file into the "lib" directory
- under your "xsltc" directory.
-
- You are now set to run the XSLT compiler.
-
-------------------------------------------------------------
-ADDITIONS FROM VERSION 5 (of the PREVIEW COMPILER)
-------------------------------------------------------------
-
-Support for
-
- - Simplified Stylesheets
- - id() and key() in match patterns
-
-------------------------------------------------------------
-XSLT 1.0 Features Not Suported in PREVIEW VERSION 6
-------------------------------------------------------------
-
-The following XSLT 1.0 features are not yet supported:
-
- * Nonstatic external Java methods.
- You may call static Java functions
- using a namespace prefix matching the class name that is
- associated with the following URL:
-
- http://www.sun.com/xsltc/java/YourJavaClass
-
- * Namespace axis
-
-------------------------------------------------------------
-LIST OF FILES
-------------------------------------------------------------
-
-The files included in this preview package are as follows:
-
-xsltc-1_0-alpha5-bin.zip
- <install dir>/xsltc
- LICENSE.txt (license file)
- XSLTCprn_lg.txt (copyright notice)
- README (this file)
- README.api (describes Translet API)
- README.xslt (describes runtime command line interface)
- README.xsltc (describes compiler command line interface)
- bin
- xslt (runtime for Unix)
- xsltc (compiler for Unix)
-
- xslt.bat (runtime for DOS)
- xsltc.bat (compiler for DOS)
- demo
- README
- TransletDemo.prc (Palm Pilot install file)
- lib
- xml.jar
- xsltc.jar
- xsltcrt.jar ('rt' = runtime)
- [BCEL.jar goes here] (see REQUIRED PACKAGE above)
- samples
- set of xml and xsl files for you to try
- src
- subset of the runtime package to complement README.api
- plus an Applet demo and a servlet demo
- com/sun/xslt/demo/servlet
- README.servlet (describes Servlet demo)
- com/sun/xslt/demo/applet
- README.applet (describes Applet demo)
-
-------------------------------------------------------------
-HOW TO INSTALL XSLTC AND RUN THE SAMPLES
-------------------------------------------------------------
-
-1. Unzip the files in a directory of your choice, for example
- from the user directory '/home/user1', the distribution
- zip file can be unzipped using the jar command as:
-
- jar xvf xsltc-1_0-alpha5-bin.zip
-
- The subdirectory 'xslt' will be created in '/home/user1'.
-
-2. Set the XSLT environment variable to point to your installation
- directory. Set your PATH environment variable to include
- the bin directory of XSLT.
-
- For example, in the bash shell:
-
- export XSLT=/home/user1/xslt
- export PATH=$XSLT/bin:$PATH
-
-3. Compile the stylesheet to produce a Java class file.
-
- For example, on the Unix platform, to compile the play1.xsl
- stylesheet for the play.xml document:
-
- cd /home/user1/xsltc/samples
- xsltc play1.xsl
-
- The compiled stylesheet will be in the main Java class file
- 'play1.class'
-
- NOTE: The 'xlstc' shell script adds the required jars to your CLASSPATH
-
- For example, on the Windows platform, to compile the play1.xsl
- stylesheet for the play.xml document:
-
- set classpath=c:\xsltc\samples;c:\xsltc\lib\xsltc.jar;
- c:\xsltc\lib\xsltcrt.jar;c:\xsltc\lib\xml.jar;
- c:\xsltc\lib\BCEL.jar;.
- cd c:\xsltc\samples
- java com.sun.xslt.compiler.XSLTC play1.xsl
-
-4. Use the compiled Java class file (play1.class) to transform
- the example XML document.
-
- For example, on the Unix platform:
-
- xslt play.xml play1
-
- For example, on the Windows platform:
-
- java com.sun.xslt.runtime.DefaultRun play.xml play1
-
- The result is sent to standard output.
-
- NOTE: When running the compiled stylesheet, you
- just specify the name of its Java class, not its
- file name (e.g., play1, not play1.class).
- You do not include the ".class" extension, nor
- the path to the class. The class is found by means
- of the Java CLASSPATH variable. If you run
- the translet from a directory other
- than the directory in which the compiled
- stylesheet class is located, you need to add
- that directory to your Java CLASSPATH. Also, you
- need to remove directories from your CLASSPATH
- for prior installations of XSLTC and any references
- to Sun's project X parser (com.sun.xml.tree)
- installed from some other XML application/tool.
-
- NOTE: The javadocToHtml sample calls external Java methods
- from the JavadocFormatter class. Before compiling the
- javadocToHtml.xsl stylesheet, compile the
- JavadocFormatter class using 'javac'.
-
-------------------------------------------------------------
-END OF README
diff --git a/xdocs/sources/xsltc/README.APACHE b/xdocs/sources/xsltc/README.APACHE
deleted file mode 100644
index c7cd61f..0000000
--- a/xdocs/sources/xsltc/README.APACHE
+++ /dev/null
@@ -1,86 +0,0 @@
-README.APACHE
-=====================================================================
-Entire source tree and support packages are located in the single jar
-file 'apache.jar'.
-
-
-Installation
--------------
-
-(1) create directory [Root], unpack 'apache.jar' there.
- ex) % cd /tmp; mkdir xsltc_apache
- % cd xsltc_apache
- copy apache.jar to xsltc_apache directory
- % jar xvf apache.jar
- cleanup
- % rm -rf META-INF apache.jar
-
- Unpacking the jar file will result in the following tree:
-
- [Root]
- External/
- BCEL/ ... contains BCEL.jar
- JLex/ ... contains JLex.jar
- java_cup/ ... contains java_cup.jar, runtime/runtime.jar
- xml-tr2/ ... contains xml.jar
- bin/
- xslt
- xsltc
- doc/
- api/ ... contains javadoc for api
- src/
- GNUmakefile
- GNUmakefile.allinc
- docs/
- LICENSE.txt
- Message.txt
- README
- README.api
- README.xslt
- README.xsltc
- XSLTCprn_lg.txt*
- xsltcA3.txt
- org/
- apache/
- xalan/
- xsltc/
- (src tree) ... all the source code files
-
-
- The 'src tree' is a hierarchy of the following packages:
- org.apache.xalan.xsltc
- org.apache.xalan.xsltc.compiler
- org.apache.xalan.xsltc.compiler.util
- org.apache.xalan.xsltc.dom
- org.apache.xalan.xsltc.runtime
- org.apache.xalan.xsltc.util
- org.apache.xalan.xsltc.util.getopt
-
-
-(2) make bin programs executable
- % chmod +x bin/*
-
-(3) set env variable to point to top of directory [Root]
- ex) % setenv XSLT /tmp/xsltc_apache
-
-(4) compile sources (uses gnu make and the provides 'GNUmakefile'). This
- will create java classes in [Root]/classes, e.g. /tmp/xsltc_apache/classes.
- (No need to set your CLASSPATH variable.)
-
- ex) % cd src; gmake again
-
- Note: the 'again' target forces everything to be built from scratch,
- including the java_cup source files. Subsequent builds can be done
- using the 'classes' target.
-
-(5) make the javadoc
- ex) % gmake jdoc
-
-(6) add bin directory to your executable path,
- ex) % set path=($XSLT/bin $path)
-
-(7) test distribution, given a stylesheet (test.xsl) and an input xml doc
- (test.xml), and be sure current working directory (.) is in your
- CLASSPATH.
- % xsltc test.xsl ... creates translet, test.class
- % xslt test.xml test ... runs translet on xml input
diff --git a/xdocs/sources/xsltc/README.api b/xdocs/sources/xsltc/README.api
deleted file mode 100644
index 601b092..0000000
--- a/xdocs/sources/xsltc/README.api
+++ /dev/null
@@ -1,422 +0,0 @@
-============================================================
- README FILE FOR THE SUN XSLT COMPILER API
- Preview Version 5
- February, 2001
- Copyright (c) Sun Microsystems, 2001
-============================================================
-
-The Sun XSLT Compiler (XSLTC) is a Java-based tool for
-compiling XSL stylesheets into extremely lightweight and
-portable Java byte code. The Sun XSLTC Java Runtime environment
-can then process XML files against these compiled stylesheets
-(Translets) to generate any manner of output per the style-
-sheet instructions.
-
-CONTENTS OF THIS DOCUMENT:
- 1. HOW TO INCLUDE TRANSLETS IN YOUR APPLICATIONS
- 2. FULL CODE EXAMPLE 1, (uses a SAX DocumentHandler).
- 3. COMPILING AND RUNNING THE EXAMPLE
- 4. FULL CODE EXAMPLE 2, (uses DefaultSAXOutputHandler).
- 5. APPENDIX (TextOut and DefaultSAXOutputHandler)
-
-
-
-
-1. HOW TO INCLUDE TRANSLETS IN YOUR APPLICATIONS
----------------------------------------------------------------------
-
-Translets implement the interface com.sun.xslt.Translet
-that you will find in the src directory.
-
-public interface Translet {
- public void transform(DOM document, TransletOutputHandler handler)
- throws TransletException;
-
- public void transform(DOM document, TransletOutputHandler[] handlers)
- throws TransletException;
-
- public void transform(DOM document, NodeIterator iterator,
- TransletOutputHandler handler) throws
- TransletException;
-
- public Object addParameter(String name, Object value);
-
- public void buildKeys(DOM document, NodeIterator iterator,
- TransletOutputHandler handler, int root) throws
- TransletException;
-
- public String getOutputEncoding();
-}
-
-The Translet takes a DOMImpl object (created from an input XML document),
-as input and transforms it. The results of the transformation are
-sent to an event-based output handler that implements the
-com.sun.xslt.TransletOutputHandler interface :
-
-
-public interface com.sun.xslt.TransletOutputHandler {
- public void startDocument() throws TransletException;
- public void endDocument() throws TransletException;
- public void characters(char[] characters, int offset, int length)
- throws TransletException;
- public void startElement(String elementName) throws TransletException;
- public void endElement(String elementName) throws TransletException;
- public void attribute(String attributeName, String attributeValue)
- throws TransletException;
- public void comment(String comment) throws TransletException;
- public void processingInstruction(String target, String data)
- throws TransletException;
- public void setType(int type);
- public void setIndent(boolean indent);
- public boolean setEscaping(boolean escape) throws TransletException;
- public void insertCdataElement(String elementName);
-}
-
-
-You create an instance of the class that implements the Translet interface
-using Java reflection:
-
- Class clazz = Class.forName("classname");
- Translet translet = (Translet) clazz.newInstance();
-
-where "classname" is the name of the class generated by XSLTC.
-In order to execute a transformation, both a document and a SAX-like
-handler (TransletOutputHandler) are needed.
-A document instance can be created with the aid of SAX-complaint XML parser.
-For example, using Sun's parser you would write,
-
- import com.sun.xslt.dom.DOMImpl;
- import com.sun.xml.parser.Parser;
- import com.sun.xml.parser.Resolver;
-
- // Create new instances of DOM and Parser
- DOMImpl dom = new DOMImpl();
- Parser parser = new Parser();
-
- // Set a SAX handler to build a DOM tree
- parser.setDocumentHandler(dom.getBuilder());
-
- // Parse the document and build a DOM tree
- InputSource input = new InputSource(
- new FileReader("xmlfile.xml"));
- parser.parse(input);
-
-In this example a document is parsed from a file, but it is also
-possible to parse a document from a URI by writing,
-
- parser.parse("http://.../xmlfile.xml");
-
-To transform the input XML document, a call is made to the translet's
-transform() method. In order to do its work, the transform() method
-takes two arguments, (1) the DOMImpl object created from parsing
-the input XML document, and (2) an output handler. The output handler
-must implement the org.xml.sax.DocumentHandler interface. You
-have the option of: (1) writing your own class that implements
-DocumentHandler, or (2) using our default class
-'com.sun.xslt.runtime.DefaultSAXOutputHandler' instead.
-The source code for our DefaultSAXOutputHandler is included
-in this package in the com/sun/xslt/runtime directory.
-This is a change from the previous releases of
-our compiler API. If you wanted to create your own
-output handler in previous releases, you would have write a class that
-implemented the interface TransletOutputHandler. This change was made
-so that users could more easily plug in any SAX compliant output
-handler. To plug in the SAX compliant output handler,
-(whether it is a user written class or our DefaultSAXOutputHandler)
-into the transform() method, it must be wrapped in a
-TextOutput object first.
-
-The Translet.transform() method may also take an array of output handlers.
-In this case the transformation will be able to select which handler
-to send output to by using the extension element <translet:output port="n">
-where 'n' is a 0-based index in the array of output handlers.
-
-Lets take a look at the code needed to carry out both of the options
-for passing the SAX output handler to the translet's transform() method:
-
- (1) You would write your own output handler that implements
- the org.xml.sax.DocumentHandler interface, pass this class
- into our com.sun.xslt.runtime.TextOutput class which itself
- implements the TransletOutputHandler interface.
-
- (2) You would create an instance of the default SAX output handler,
- com.sun.xslt.runtime.DefaultSAXOutputHandler, pass this
- instance into our com.sun.xslt.runtime.TextOutput class which
- itself implements the TransletOutputHandler interface.
-
-
-In option (1), we want to use a SAX compliant output handler that we write
-ourselves. In this case we create our Handler class, which implements
-org.xml.sax.DocumentHandler:
-
-import org.xml.sax.DocumentHandler;
-
-// user supplied SAX Handler:
-class Handler implements DocumentHandler {
- public void startDocument() throws SAXException {}
-
- public void endDocument() throws SAXException {}
-
- public void characters(char[] characters, int offset, int length)
- throws SAXException
- {
- System.out.println(new String(characters, offset, length));
- }
- public void startElement(String elementName, AttributeList attrs)
- throws SAXException {}
- public void endElement(String elementName) throws SAXException {}
- public void setDocumentLocator(Locator loc) {}
- public void ignorableWhitespace(char[] characters, int offset, int length)
- throws SAXException {}
- public void processingInstruction(String target, String data)
- throws SAXException {}
-}
-
-Now before we pass our handler to the transform() method, we wrap it
-in a TextOutput object (which implements the TransletOutputHandler
-interface for us). Then given the instantiated translet class,
-the transform method could be called as:
-
- import com.sun.xslt.runtime.TextOutput;
-
- DOMImpl dom;
- ...
- Handler saxHandler;
- TextOutput textOutput;
- try {
- saxHandler = new Handler();
- textOutput = new TextOutput(saxHandler);
- translet.transform(dom, textOutput);
- } catch (TransletException e){
- ...
- } catch (IOException e){
- ...
- }
-
-
-By using the TextOutput wrapper class, one can also control the character
-encoding. The TextOutput class has an additional constructor that takes
-the DocumentHandler and a String that describes the encoding, for example
-'textOutput' could have been created as:
-
- textOutput = new TextOutput(saxHandler, "utf-8");
-
-Finally, option (2) is much like option (1) except you do not have
-to write your own DocumentHandler. We provide one by default. To use the
-default one, instantiate 'com.sun.xslt.runtime.DefaultSAXOutputHandler'
-rather than instantiating your own class (such as Handler above):
-
- import com.sun.xslt.runtime.DefaultSAXOutputHandler;
- import com.sun.xslt.runtime.TextOutput;
-
- DefaultSAXOutputHandler defhandlr;
- try {
- defhandlr = new DefaultSAXOutputHandler(System.out, "utf-8");
- translet.transform(dom, new TextOutput(defhandlr));
- } catch (TransletException e){
- ...
- } catch (IOException e){
- ...
- }
-
-For a quick reference to the TextOutput and DefaultSAXOutputHandler
-constructors available, see the Appendix.
-
-In the following sections, full code examples are shown.
-
-Finally, if you want the transformation results in the DOM form:
-
-DOM result = new DOM();
-translet.transform(dom, result.getOutputDomBuilder());
-
-If the compiled stylesheet requires the values of global
-parameters to be set, you should call addParameter() before
-calling the transform() method.
-
-
-2. FULL CODE EXAMPLE 1, XsltApp.java, uses a SAX DocumentHandler.
- This example corresponds to option (1) in discussion above.
-------------------------------------------------------------------
-import java.io.FileReader;
-import java.io.IOException;
-import com.sun.xslt.dom.DOMImpl;
-import com.sun.xslt.runtime.TextOutput;
-import com.sun.xslt.Translet;
-import com.sun.xslt.TransletException;
-import com.sun.xml.parser.Parser;
-import org.xml.sax.AttributeList;
-import org.xml.sax.DocumentHandler;
-import org.xml.sax.InputSource;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-
-
-// Create a SAX Output Handler
-class Handler implements DocumentHandler {
- public void startDocument() throws SAXException {}
-
- public void endDocument() throws SAXException {}
-
- public void characters(char[] characters, int offset, int length)
- throws SAXException
- {
- System.out.println(new String(characters, offset, length));
- }
-
- public void startElement(String elementName, AttributeList attrs)
- throws SAXException {}
-
- public void endElement(String elementName) throws SAXException {}
-
- public void setDocumentLocator(Locator loc) {}
-
- public void ignorableWhitespace(char[] characters, int offset, int length)
- throws SAXException {}
-
- public void processingInstruction(String target, String data)
- throws SAXException {}
-
-}
-
-public class XsltApp {
- public static void main(String[] args){
- XsltApp app = new XsltApp();
- app.run(args);
- }
-
- public void run(String[] args){
- if(args.length != 2){
- usage();
- }
- String inputFileName = args[0];
- String transletName = args[1];
-
- DOMImpl dom = new DOMImpl();
- Parser parser = new Parser();
- parser.setDocumentHandler(dom.getBuilder());
- InputSource input = null;
- try {
- input = new InputSource(new FileReader(inputFileName));
- } catch( java.io.FileNotFoundException e){
- System.err.println("File " + inputFileName + " not found");
- System.exit(1);
- }
-
- try {
- parser.parse(input);
- } catch (org.xml.sax.SAXException e){
- System.err.println("Error: " + e);
- System.exit(1);
- } catch (IOException e){
- System.err.println("Error: " + e);
- System.exit(1);
- }
-
- Class transletPluggable = null;
- try {
- transletPluggable = Class.forName(transletName);
- } catch (java.lang.ClassNotFoundException e){
- System.err.println("Error: " + e);
- System.exit(1);
- }
-
- Translet translet = null;
- try {
- translet = (Translet)transletPluggable.newInstance();
- } catch (java.lang.Exception e){
- System.err.println("Error instantiating pluggable translet");
- System.exit(1);
- }
-
- Handler saxHandler;
- TextOutput textOutput;
- try {
- saxHandler = new Handler();
- textOutput = new TextOutput(saxHandler, "utf-8");
- translet.transform(dom, textOutput);
- } catch (TransletException e){
- System.err.println("Error: " + e);
- System.exit(1);
- } catch (IOException e){
- System.err.println("Error: " + e);
- System.exit(1);
- }
- }
-
- public void usage(){
- System.out.println("Usage: \n" +
- " xsltapp <xml_file> <translet_name>\n\n" +
- " where <file> is xml source (e.g. play.xml). \n" +
- " and <translet_name> is java class (e.g. play1). \n"
- );
- System.exit(1);
- }
-}
-
-
-
-3. COMPILING AND RUNNING THE EXAMPLE:
----------------------------------------------------------------------
-
-To compile the example above, assuming you unpacked the code
-into the directory /tmp:
-
-javac -classpath "/tmp/xsltc/lib/xml.jar:/tmp/xsltc/lib/BCEL.jar:/tmp/xsltc
-/lib/xsltcrt.jar" XsltApp.java
-
-To run the example on xml document 'play.xml' and stylesheet 'play1.xsl':
-
-(1) compile the stylesheet:
- xsltc play1.xsl
-
- this will produce the translet 'play1.class'.
-
-(2) run the translet with the XsltApp demo:
-
-java -classpath /tmp/xsltc/lib/xsltcrt.jar:/tmp/xsltc/lib/xml.jar:. XsltApp play
-.xml play1
-
-
-
-4. FULL CODE EXAMPLE 2, DefaultRun.java
- This example corresponds to option (2) in the discussion above.
-------------------------------------------------------------------
-See the source file for the class 'com.sun.xslt.runtime.DefaultRun',
-which is included in the src directory. It uses the
-'DefaultSAXOutputHandler' approach.
-
-
-
-
-5. APPENDIX
-------------------------------------------------------------------
-
-TextOutput
-----------
-
-package com.sun.xslt.runtime;
-
-public final class TextOutput implements TransletOutputHandler {
- public TextOutput(DocumentHandler handler) throws IOException;
- public TextOutput(DocumentHandler handler, String encoding) throws
- IOException;
-}
-
-
-DefaultSAXOutputHandler
------------------------
-package com.sun.xslt.runtime;
-
-public class DefaultSAXOutputHandler implements DocumentHandler{
- public DefaultSAXOutputHandler(Writer writer) throws IOException;
- public DefaultSAXOutputHandler(OutputStream out, String encoding)
- throws IOException;
- public DefaultSAXOutputHandler(String filename, String encoding)
- throws IOException;
- ...
-}
-
-
-
-------------------------------------------------------------
-END OF README
diff --git a/xdocs/sources/xsltc/README.xslt b/xdocs/sources/xsltc/README.xslt
deleted file mode 100644
index 3c0cbe8..0000000
--- a/xdocs/sources/xsltc/README.xslt
+++ /dev/null
@@ -1,97 +0,0 @@
-NAME
- xslt - Sun XSLT runtime processor.
-
-
-SYNOPSIS
- xslt [-j <jarfile>] {-u <document_url> | <document>} <class>
- [<name1>=<value1> ...]
-
-
-DESCRIPTION
- The Sun XSLT runtime processor is a Java-based tool for
- transforming XML document files using a translet (compiled
- stylesheet).
-
- The XSLT processor can be run on any platform including UNIX,
- Windows, NT, Mac that supports Java, including a Palm Pilot
- with J2ME CLDC (Java 2 Micro Edition, Connected Limited Device
- Configuration).
-
-OPTIONS
-
- The following options are supported:
-
- -j <jarfile>
- gets the translet <class> from the specified <jarfile>
- instead of from the user's CLASSPATH.
-
- -u
- Specifies that the XML <document> location will be a URI
- such as 'http://myserver/hamlet.xml'.
-
-
-OPERANDS
-
- The following operands are supported:
-
- <document> An XML document to be processed.
- <document_url> An XML document to be processed, specified
- as a URL (See -u option above).
-
- <class> The translet that will do the processing.
- The translet may optionally take a set of
- global parameters specified as name-value
- pairs. A name-value pair uses the format
- <name>=<value>.
-
-EXAMPLES
- Example 1: Processing an XML document.
-
- example% xslt hamlet.xml hamlet
-
- where the current working directory contains an XML document
- 'hamlet.xml' to be processed by the translet class 'hamlet'.
- The translet would have been created initially using
- xsltc to compile a XSLT stylesheet named 'hamlet.xsl'.
-
- Example 2: Loading translet from a jar file.
-
- example% xslt -j hamlet.jar hamlet.xml hamlet
-
- In this case the translet class 'hamlet' is loaded from the
- specified jar file, 'hamlet.jar' instead of from the user's
- CLASSPATH.
-
- Example 3: If the translet defined global parameters, then
- these can be passed on the command line to the runtime processor
- as a space separated list of name-value pairs using the format
- <name>=<value>. For example,
-
- example% xslt hamlet.xml hamlet speaker=HAMLET 'scene=SCENE IV'
-
- Notice that the second name-value pair had to be quoted due to
- the intervening space in the value "SCENE IV".
-
- example% xslt -u http://zarya.east/test.xml hamlet
-
- where the xml document 'test.xml' can be specified as a URL.
-
-FILES
- file.xml input XML document to be processed.
- file.class byte code file.
- file.jar java archive file.
-
-SEE ALSO
- xsltc, jar.
-
-BUGS
- Refer to the top-level README included in this release.
-
-AUTHORS
- Jacek Ambroziak, jacek.ambroziak@East.Sun.COM
- Santiago Pericas-Geertsen, santiago.pericasgeertsen@East.Sun.COM
-
- Contributors:
-
- Morten Jorgensen morten.jorgensen@Ireland.Sun.COM
- G. Todd Miller, todd.miller@East.Sun.COM
diff --git a/xdocs/sources/xsltc/README.xsltc b/xdocs/sources/xsltc/README.xsltc
deleted file mode 100644
index 50c77d4..0000000
--- a/xdocs/sources/xsltc/README.xsltc
+++ /dev/null
@@ -1,116 +0,0 @@
-NAME
- xsltc - Sun XSLT Compiler
-
-
-SYNOPSIS
- xsltc [-o <output>] [-d <directory>] [-j <jarfile>]
- [-p <package name>]
- [-u] <stylesheet>...
-
-
-DESCRIPTION
- The Sun XSLT Compiler is a Java-based tool for compiling XSLT
- stylesheets into lightweight and portable Java byte codes
- called translets.
-
- The XSLT Compiler can be run on any platform including UNIX,
- Windows, NT, Mac that supports Java 1.2.x or later. The generated
- translets can be run on any platform that supports a Java
- Runtime Environment, including a Palm Pilot with J2ME CLDC
- (Java 2 Micro Edition, Connected Limited Device Configuration).
-
-OPTIONS
-
- The following options are supported:
-
- -o <output>
- Changes the name of the generated translet class.
- By default, the translet class would be named
- <stylesheet>, if -o <output> is set, then the
- translet class would be named <output>. Translet
- class files are written as .class files.
-
- -d <directory>
- Changes the destination directory. By default, any
- translet class files generated would be placed in
- the current working directory. If -d <directory>
- is specified, the files would be output to <directory>.
-
- -j <jarfile>
- Outputs all generated translet class files into a
- jar file named <jarfile>.jar. When this option is
- used only a jar file will be output.
-
- -p <package name>
- Specify a package name for all generated translet
- classes.
-
- -u
- Specifies that <stylesheet> location will be a URI
- such as 'http://myserver/stylesheet1.xsl'.
-
-
-OPERANDS
-
- The following operand is supported:
-
- <stylesheet> A path name of an input stylesheet file.
-
-
-EXAMPLES
- Example 1: Creating a translet from stylesheet 'hamlet.xsl'.
-
- example% xsltc hamlet.xsl
-
- would produce a set of class files such as 'hamlet.class',
- 'hamlet$0.class', 'hamlet$1.class'.
-
- Example 2: Outputting all classes into a jar file.
-
- example% xsltc -j hamlet.jar hamlet.xsl
-
- would produce a single jar file output, 'hamlet.jar' which would
- contain all the generated .class files for the hamlet translet.
-
- Example 3: Naming the class file.
-
- example% xsltc -o newhamlet hamlet.xsl
-
- would produce a set of class files such as 'newhamlet.class',
- 'newhamlet$0.class', etc rather than the default which would
- be 'hamlet.class', 'hamlet$0.class', etc.
-
- Example 4: Multiple stylesheets.
-
- example% xsltc hamlet1.xsl hamlet2.xsl hamlet3.xsl
-
- would produce a set of class files derived from the three
- stylesheets.
-
- Example 5: Package Specification.
-
- example% xsltc -p com.mycompany.translets hamlet.xsl
-
- would produce a set of class files such as
- 'com/mycompany/translets/hamlet.class',
- 'com/mycompany/translets/hamlet$0.class', etc.
-
-FILES
- file.xsl input XSLT stylesheet
- file.class byte code file
- file.jar java archive file
-
-SEE ALSO
- xslt, jar.
-
-BUGS
- Refer to the top-level README included in this release.
-
-AUTHORS
- Jacek Ambroziak, jacek.ambroziak@East.Sun.COM
- Santiago Pericas-Geertsen, santiago.pericasgeertsen@East.Sun.COM
-
- Contributors:
-
- Morten Jorgensen morten.jorgensen@Ireland.Sun.COM
- G. Todd Miller, todd.miller@East.Sun.COM
diff --git a/xdocs/sources/xsltc/README2 b/xdocs/sources/xsltc/README2
deleted file mode 100644
index c7cd61f..0000000
--- a/xdocs/sources/xsltc/README2
+++ /dev/null
@@ -1,86 +0,0 @@
-README.APACHE
-=====================================================================
-Entire source tree and support packages are located in the single jar
-file 'apache.jar'.
-
-
-Installation
--------------
-
-(1) create directory [Root], unpack 'apache.jar' there.
- ex) % cd /tmp; mkdir xsltc_apache
- % cd xsltc_apache
- copy apache.jar to xsltc_apache directory
- % jar xvf apache.jar
- cleanup
- % rm -rf META-INF apache.jar
-
- Unpacking the jar file will result in the following tree:
-
- [Root]
- External/
- BCEL/ ... contains BCEL.jar
- JLex/ ... contains JLex.jar
- java_cup/ ... contains java_cup.jar, runtime/runtime.jar
- xml-tr2/ ... contains xml.jar
- bin/
- xslt
- xsltc
- doc/
- api/ ... contains javadoc for api
- src/
- GNUmakefile
- GNUmakefile.allinc
- docs/
- LICENSE.txt
- Message.txt
- README
- README.api
- README.xslt
- README.xsltc
- XSLTCprn_lg.txt*
- xsltcA3.txt
- org/
- apache/
- xalan/
- xsltc/
- (src tree) ... all the source code files
-
-
- The 'src tree' is a hierarchy of the following packages:
- org.apache.xalan.xsltc
- org.apache.xalan.xsltc.compiler
- org.apache.xalan.xsltc.compiler.util
- org.apache.xalan.xsltc.dom
- org.apache.xalan.xsltc.runtime
- org.apache.xalan.xsltc.util
- org.apache.xalan.xsltc.util.getopt
-
-
-(2) make bin programs executable
- % chmod +x bin/*
-
-(3) set env variable to point to top of directory [Root]
- ex) % setenv XSLT /tmp/xsltc_apache
-
-(4) compile sources (uses gnu make and the provides 'GNUmakefile'). This
- will create java classes in [Root]/classes, e.g. /tmp/xsltc_apache/classes.
- (No need to set your CLASSPATH variable.)
-
- ex) % cd src; gmake again
-
- Note: the 'again' target forces everything to be built from scratch,
- including the java_cup source files. Subsequent builds can be done
- using the 'classes' target.
-
-(5) make the javadoc
- ex) % gmake jdoc
-
-(6) add bin directory to your executable path,
- ex) % set path=($XSLT/bin $path)
-
-(7) test distribution, given a stylesheet (test.xsl) and an input xml doc
- (test.xml), and be sure current working directory (.) is in your
- CLASSPATH.
- % xsltc test.xsl ... creates translet, test.class
- % xslt test.xml test ... runs translet on xml input
diff --git a/xdocs/sources/xsltc/all_namespaces.gif b/xdocs/sources/xsltc/all_namespaces.gif
deleted file mode 100644
index 38034b7..0000000
--- a/xdocs/sources/xsltc/all_namespaces.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/cast_expression.gif b/xdocs/sources/xsltc/cast_expression.gif
deleted file mode 100644
index 9bb0090..0000000
--- a/xdocs/sources/xsltc/cast_expression.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/compiler_AST.gif b/xdocs/sources/xsltc/compiler_AST.gif
deleted file mode 100644
index 69871b6..0000000
--- a/xdocs/sources/xsltc/compiler_AST.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/compiler_DOM.gif b/xdocs/sources/xsltc/compiler_DOM.gif
deleted file mode 100644
index a056cbb..0000000
--- a/xdocs/sources/xsltc/compiler_DOM.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/compiler_architecture.gif b/xdocs/sources/xsltc/compiler_architecture.gif
deleted file mode 100644
index e57d661..0000000
--- a/xdocs/sources/xsltc/compiler_architecture.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/dom_namespace1.gif b/xdocs/sources/xsltc/dom_namespace1.gif
deleted file mode 100644
index 2b9418e..0000000
--- a/xdocs/sources/xsltc/dom_namespace1.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/dom_namespace2.gif b/xdocs/sources/xsltc/dom_namespace2.gif
deleted file mode 100644
index 7fce24d..0000000
--- a/xdocs/sources/xsltc/dom_namespace2.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/dom_namespace3.gif b/xdocs/sources/xsltc/dom_namespace3.gif
deleted file mode 100644
index d62b9b8..0000000
--- a/xdocs/sources/xsltc/dom_namespace3.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/index.xml b/xdocs/sources/xsltc/index.xml
deleted file mode 100644
index cbe1878..0000000
--- a/xdocs/sources/xsltc/index.xml
+++ /dev/null
@@ -1,118 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 2001 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 2001, Sun
- * Microsystems., http://www.sun.com. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-<s1 title="Introduction to XSLTC">
- <p><ref>Design documents by <jump href="mailto:morten@xml.apache.org">Morten Jørgensen</jump>
- - updated 06.03.2001</ref></p>
-<ul>
- <li><link anchor="compiler">Compiler design</link></li>
- <li><link anchor="runtime">Runtime library/DOM design</link></li>
- <li><link idref="xsltc_trax">Integration of the Translet API and TrAX</link> (by G Todd Miller)</li>
-
-</ul>
-<p>See also <jump href="../xsltc_usage.html">Using XSLTC</jump>.</p>
-<anchor name="compiler"/>
- <s2 title="Compiler design">
- <p><link idref="xsltc_compiler"><img src="compiler_architecture.gif" alt="compiler_architecture.gif"/></link></p>
- <p><ref>Figure 1: Compiler architecture overview</ref></p>
- <p>Click on the picture to jump to the overall design document for the compiler.</p>
- <p>Each XSL element/function and XPath expression/pattern is represented by
- its own class in the Abstract Syntax Tree (AST). Some of these classes have
- their own design documents (I am working on the rest of them):</p>
- <s3 title="XSL elements">
- <ul>
- <li>
- <link idref="xsl_whitespace_design"><xsl:preserve-space>/<xsl:strip-space></link>
- </li>
- <li>
- <link idref="xsl_sort_design"><xsl:sort></link>
- </li>
- <li>
- <link idref="xsl_key_design"><xsl:key></link>
- </li>
- <li>
- <link idref="xsl_comment_design"><xsl:comment>/<xsl:message></link>
- </li>
- </ul>
- </s3>
- <s3 title="XSL functions">
- <ul>
- <li>
- <link idref="xsl_key_design">key()</link>
- </li>
- <li>
- <link idref="xsl_lang_design">lang()</link>
- </li>
- <li>
- <link idref="xsl_unparsed_design">unparsed-entity-uri()</link>
- </li>
- </ul>
- </s3>
- </s2><anchor name="runtime"/>
- <s2 title="Runtime library/DOM design">
- <p><link idref="xsltc_runtime"><img src="runtime_architecture.gif" alt="runtime_architecture.gif"/></link></p>
- <p><ref>Figure 2: Runtime library architecture overview</ref></p>
- <p>Click on the picture to jump to the overall design document for the XSLTC
- runtime library. This document describes the structure of the compiled
- translet as well as the translet runtime library.</p>
- <p>The <link idref="xsltc_dom">Internal DOM</link> describes the components and structure of the internal DOM,
- support for DOM2 navigation, the DOM adapter, DOM multiplexer, and DOM builder.</p>
- <p><link idref="xsltc_namespace">Namespaces</link> explains how XSLTC (including the compiler) handles
- namespaces.</p>
- </s2>
-</s1>
\ No newline at end of file
diff --git a/xdocs/sources/xsltc/key_relations.gif b/xdocs/sources/xsltc/key_relations.gif
deleted file mode 100644
index 946d4dc..0000000
--- a/xdocs/sources/xsltc/key_relations.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/match_namespace1.gif b/xdocs/sources/xsltc/match_namespace1.gif
deleted file mode 100644
index 4d0056d..0000000
--- a/xdocs/sources/xsltc/match_namespace1.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/match_namespace2.gif b/xdocs/sources/xsltc/match_namespace2.gif
deleted file mode 100644
index db10277..0000000
--- a/xdocs/sources/xsltc/match_namespace2.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/namespace_stack.gif b/xdocs/sources/xsltc/namespace_stack.gif
deleted file mode 100644
index a469d23..0000000
--- a/xdocs/sources/xsltc/namespace_stack.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/output_namespaces1.gif b/xdocs/sources/xsltc/output_namespaces1.gif
deleted file mode 100644
index 5068fc2..0000000
--- a/xdocs/sources/xsltc/output_namespaces1.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/output_namespaces2.gif b/xdocs/sources/xsltc/output_namespaces2.gif
deleted file mode 100644
index aaf7cf7..0000000
--- a/xdocs/sources/xsltc/output_namespaces2.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/pattern_objects.gif b/xdocs/sources/xsltc/pattern_objects.gif
deleted file mode 100644
index ea07393..0000000
--- a/xdocs/sources/xsltc/pattern_objects.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/runtime_architecture.gif b/xdocs/sources/xsltc/runtime_architecture.gif
deleted file mode 100644
index 9c8e2e7..0000000
--- a/xdocs/sources/xsltc/runtime_architecture.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/runtime_type_mapping.gif b/xdocs/sources/xsltc/runtime_type_mapping.gif
deleted file mode 100644
index 769a993..0000000
--- a/xdocs/sources/xsltc/runtime_type_mapping.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/sort_objects.gif b/xdocs/sources/xsltc/sort_objects.gif
deleted file mode 100644
index 0ec7cbb..0000000
--- a/xdocs/sources/xsltc/sort_objects.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/type_mapping.gif b/xdocs/sources/xsltc/type_mapping.gif
deleted file mode 100644
index bb3cbb9..0000000
--- a/xdocs/sources/xsltc/type_mapping.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/type_mappings.gif b/xdocs/sources/xsltc/type_mappings.gif
deleted file mode 100644
index 31f888c..0000000
--- a/xdocs/sources/xsltc/type_mappings.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/typecast.gif b/xdocs/sources/xsltc/typecast.gif
deleted file mode 100644
index 2a9c168..0000000
--- a/xdocs/sources/xsltc/typecast.gif
+++ /dev/null
Binary files differ
diff --git a/xdocs/sources/xsltc/xsl_comment_design.xml b/xdocs/sources/xsltc/xsl_comment_design.xml
deleted file mode 100644
index fcc0fef..0000000
--- a/xdocs/sources/xsltc/xsl_comment_design.xml
+++ /dev/null
@@ -1,111 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 2001 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 2001, Sun
- * Microsystems., http://www.sun.com. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
- <s1 title="<xsl:comment> / <xsl:message>">
- <ul>
- <li><link anchor="functionality">Functionality</link></li>
- <li><link anchor="implementation">Implementation</link></li>
- </ul>
-<anchor name="functionality"/>
-<s2 title="Functionality">
-
- <p>The <code><xsl:comment></code> element is used to insert XML comments
- into the result document. The comment is inserted as follows in the XSL
- stylesheet:</p>
-
- <source> <element>
- <xsl:comment>This is a comment!</xsl:comment>
- </element></source>
-
- <p>and it will be output in the result document as follows:</p>
-
- <source> <element>
- <!-- This is a comment! -->
- </element></source>
-
- <p>The <code><xsl:message></code> element is used to send messages to
- who/whatever is performing the transformation. The message can be displayed
- in a terminal, a dialog box, etc. The <code><xsl:message></code> element
- is used in the same way as the <code><xsl:comment></code> element,
- however the message is <em>not</em> output in the result document.</p>
-
- <p>The <code><xsl:message></code> element has an attribute
- <code>"terminate"</code> which can be used to terminate the transformation at any
- given stage. This is useful when using message to give information about
- illegal values in the input document.</p>
-</s2><anchor name="implementation"/>
-<s2 title="Implementation">
-
- <p>The output handler class has a method for outputting comments in the
- output document and messages to the operator. The code compiled for a
- comment gathers all text that goes into the comment in a StringValueHandler
- object, retrieves the full text string from this handler, and then finally
- sends it to the output handler. Similarly the code compiled for a message
- will simply send the message to the output handler in use.</p>
-
- <p>Messages will be output to the terminal (stdout) when a transformation
- is run in a terminal. The message will be output before the beginning of the
- output document. Messages will be shown in a dialog box if a transformation
- is run in an applet.</p>
-
- <p><code><xsl:message></code> elements that use the <code>"terminate"</code>
- attribute to abort transformations cause an exception to be thrown. A
- RuntimeException is used for this, and the exception text is:</p>
- <p><code>Termination forced by an xsl:message instruction</code></p>
- </s2>
-</s1>
\ No newline at end of file
diff --git a/xdocs/sources/xsltc/xsl_key_design.xml b/xdocs/sources/xsltc/xsl_key_design.xml
deleted file mode 100644
index aa137f6..0000000
--- a/xdocs/sources/xsltc/xsl_key_design.xml
+++ /dev/null
@@ -1,214 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 2001 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 2001, Sun
- * Microsystems., http://www.sun.com. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
- <s1 title="<xsl:key> / key() / KeyPattern">
- <ul>
- <li><link anchor="functionality">Functionality</link></li>
- <li><link anchor="implementation">Implementation</link></li>
- </ul>
- <anchor name="functionality"/>
- <s2 title="Functionality">
-
- <p>The <code><xsl:key></code> element is a top-level element that can be
- used to define a named index of nodes from the source XML tree(s). The
- element has three attributes:</p>
-
- <ul>
- <li>
- <code>name</code> - the name of the index
- </li>
- <li>
- <code>match</code> - a pattern that defines the nodeset we want
- indexed
- </li>
- <li>
- <code>use</code> - an expression that defines the value to be used
- as the index key value.
- </li>
- </ul>
-
- <p>A named index can be accessed using either the <code>key()</code> function or
- a KeyPattern. Both these methods address the index using its defined name
- (the "name" attribute above) and a parameter defining one or more lookup
- values for the index. The function or pattern returns a node set containing
- all nodes in the index whose key value match the parameter's value(s):</p>
-
- <source>
- <xsl:key name="book-author" match="book" use="author"/>
- :
- :
- <xsl:for-each select="key('book-author', 'Mikhail Bulgakov')">
- <xsl:value-of select="author"/>
- <xsl:text>: </xsl:text>
- <xsl:value-of select="author"/>
- <xsl:text>&#xa;</xsl:text>
- </xsl:for-each>
- </source>
-
- <p>The KeyPattern can be used within an index definition to create unions
- and intersections of node sets:</p>
-
-<source>
- <xsl:key name="cultcies" match="farmer | fisherman" use="name"/>
-</source>
-
- <p>This could of course be done using regular <code><xsl:for-each></code>
- and <code><xsl:select></code> elements. However, if your stylesheet
- accesses the same selection of nodes over and over again, the transformation
- will be much more efficient using pre-indexed keys as shown above.</p>
- </s2><anchor name="implementation"/>
- <s2 title="Implementation">
-
- <p>AbstractTranslet has a global hashtable that holds an index for each named
- key in the stylesheet (hashing on the "name" attribute of xsl:key).
- AbstractTranslet has a couple of public methods for inserting and retrieving
- data from this hashtable:</p>
-
-<source>
- public void buildKeyIndex(String name, int nodeID, String value);
- public KeyIndex KeyIndex getKeyIndex(String name);
-</source>
-
- <p>The Key class compiles code that traverses the input DOM and extracts
- nodes that match some given parameters (the <code>"match"</code> attribute of the
- <code><xsl:key></code> element). A new element is inserted into the named
- key's index. The nodes' DOM index and the value translated from the
- <code>"use"</code> attribute of the <code><xsl:key></code> element are stored
- in the new entry in the index.</p>
-
- <p>The index itself is implemented in the <code>KeyIndex</code> class.
- The index has an hashtable with all the values from the matching nodes (the
- part of the node used to generate this value is the one specified in the
- <code>"use"</code> attribute). For every matching value there is a Vector
- holding a list of all node indexes for which this value gives a match:</p>
-
- <p><img src="key_relations.gif" alt="key_relations.gif"/></p>
- <p><ref>Figure 1: Indexing tables</ref></p>
-
- <p>The <code>KeyIndex</code> class implements the <code>NodeIterator</code>
- interface, so that it can be returned directly by the implementation of the
- <code>key()</code> function. This is how the index generated by
- <code><xsl:key></code> and the node-set returned by the <code>key()</code> and
- KeyPattern are tied together. You can see how this is done in the
- <code>translate()</code> method of the <code>KeyCall</code> class.</p>
-
- <p>The <code>key()</code> function can be called in two ways:</p>
-
-<source>
- key('key-name','value')
- key('key-name','node-set')
-</source>
-
- <p>The first parameter is always the name of the key. We use this value to
- lookup our index from the _keyIndexes hashtable in AbstractTranslet:</p>
-
-<source>
- il.append(classGen.aloadThis());
- _name.translate(classGen, methodGen);
- il.append(new INVOKEVIRTUAL(getKeyIndex));
-</source>
-
- <p>This compiles into a call to
- <code>AbstractTranslet.getKeyIndex(String name)</code>, and it leaves a
- <code>KeyIndex</code> object on the stack. What we then need to do it to
- initialise the <code>KeyIndex</code> to give us nodes with the requested value.
- This is done by leaving the <code>KeyIndex</code> object on the stack and pushing
- the <code>"value"</code> parameter to <code>key()</code>, before calling
- <code>lookup()</code> on the index:</p>
-
-<source>
- il.append(DUP); // duplicate the KeyIndex obejct before return
- _value.translate(classGen, methodGen);
- il.append(new INVOKEVIRTUAL(lookup));
-</source>
-
- <p>This compiles into a call to <code>KeyIndex.lookup(String value)</code>. This
- will initialise the <code>KeyIndex</code> object to return nodes that match the
- given value, so the <code>KeyIndex</code> object can be left on the stack when
- we return. This because the <code>KeyIndex</code> object implements the
- <code>NodeIterator</code> interface.</p>
-
- <p>This matter is a bit more complex when the second parameter of
- <code>key()</code> is a node-set. In this case we need to traverse the nodes in
- the set and do a lookup for each node in the set. What I do is this:</p>
-
- <ul>
- <li>
- construct a <code>KeyIndex</code> object that will hold the return node-set
- </li>
- <li>
- find the named <code>KeyIndex</code> object from the hashtable in
- AbstractTranslet
- </li>
- <li>
- get an iterator for the node-set and do the folowing loop:</li>
- <ul>
- <li>get string value for current node</li>
- <li>do lookup in KeyIndex object for the named index</li>
- <li>merge the resulting node-set into the return node-set</li>
- </ul>
- <li>
- leave the return node-set on stack when done
- </li>
- </ul>
-
- <p>The only work that remains is to update the <code>merge()</code> method of
- the <code>KeyIndex</code> class so that it eliminates duplicate nodes in the
- resulting node-set.</p>
- </s2>
-</s1>
diff --git a/xdocs/sources/xsltc/xsl_lang_design.xml b/xdocs/sources/xsltc/xsl_lang_design.xml
deleted file mode 100644
index b8c0bf0..0000000
--- a/xdocs/sources/xsltc/xsl_lang_design.xml
+++ /dev/null
@@ -1,115 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 2001 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 2001, Sun
- * Microsystems., http://www.sun.com. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
- <s1 title="lang() function">
- <ul>
- <li><link anchor="functionality">Functionality</link></li>
- <li><link anchor="implementation">Implementation</link></li>
- </ul>
- <anchor name="functionality"/>
- <s2 title="Functionality">
-
- <p>The <code>xml:lang</code> can be used to determine the language for a node or
- a node-set. The attribute can be used to store language-specific data in an
- XML document:</p>
-
- <source>
- <phrases>
- <greeting xml:lang="en">Hello!</greeting>
- <greeting xml:lang="no">Hei!</greeting>
- <greeting xml:lang="fr">Salut!</greeting>
- <greeting xml:lang="es">Hola!</greeting>
- <greeting xml:lang="de">Sweinhund!</greeting>
- </phrases>
- </source>
-
- <p>The XSL stylesheet can use the <code>lang()</code> function to select the
- element with the desired language:</p>
-
- <source>
- <xsl:template match="greeting">
- <xsl:if test="lang("de")>
- <xsl:value-of select="."/>
- <xsl:text> Grossglucklicher wunche!</xsl:text>
- </xsl:if>
- </xsl:template>
- </source>
-</s2> <anchor name="implementation"/>
-<s2 title="Implementation">
-
- <p>The DOM interface has been given a method that returns the language for
- a given node. The language is returned as a string (on whatever format is
- used in the XML document - should be iso), and may be null if no language is
- defined.</p>
-
- <source>
- public String DOM.getLanguage(int node);
- </source>
-
- <p>The BasisLibrary class has a static method that will compare the language
- of the context node with some other language and return the result as a
- boolean.</p>
-
- <source>
- public static boolean BasisLibrary.testLanguage(String language, DOM dom, int node);
- </source>
-
- <p>The compiled code for the <code>lang()</code> method calls this method in the
- BasisLibrary and leaves the result on the stack for the calling element.</p>
- </s2>
-</s1>
diff --git a/xdocs/sources/xsltc/xsl_sort_design.xml b/xdocs/sources/xsltc/xsl_sort_design.xml
deleted file mode 100644
index 6dda3a4..0000000
--- a/xdocs/sources/xsltc/xsl_sort_design.xml
+++ /dev/null
@@ -1,211 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 2001 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 2001, Sun
- * Microsystems., http://www.sun.com. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
- <s1 title="<xsl:sort>">
- <ul>
- <li><link anchor="functionality">Functionality</link></li>
- <li><link anchor="sort-class">The Sort class</link></li>
- <li><link anchor="sortingiterator-class">The SortingIterator class</link></li>
- <li><link anchor="nodesortrecord-class">The NodeSortRecord class</link></li>
- <li><link anchor="nodesortrecordfactory-class">The NodeSortRecordFactory class</link></li>
- </ul>
-
- <anchor name="functionality"/>
- <s2 title="Functionality">
-
- <p>The <code><xsl:sort></code> element is used to define a sort key which
- specifies the order in which nodes selected by either
- <code><xsl:apply-templates></code> or <code><xsl:for-each></code> are
- processed. The nodes can be sorted either in numerical or alphabetic order,
- and the alphabetic order may vary depeinding on the language in use. The
- nodes can be sorted either in ascending or descending order.</p>
-
- </s2><anchor name="sort-class"/>
- <s2 title="The Sort class">
-
- <p>Static methods of the Sort class is responsible for generating the
- necessary code for invoking SortingIterators under
- <code><xsl:apply-templates></code> and <code><xsl:for-each></code>
- elements. Both these elements can have several <code><xsl:sort></code>
- child nodes defining primary, secondary, teriary, etc. keys. The code for
- <code><xsl:apply-templates></code> and <code><xsl:for-each></code>
- create vectors containg a Sort object for each sort key. The object methods
- of the Sort object encapsulate a container for key-specific data (such as the
- sort key itself, sort order, sort type, and such) while the static methods
- take a vector of Sort objects and generate the actual code.</p>
-
- <p>The <code>translate()</code> method of the Sort object is never called. The
- vectors containing the Sort objects for a <code><xsl:apply-templates></code>
- or <code><xsl:for-each></code> element are instead passed to the static
- <code>translateSortIterator()</code> method. This method compiles code that
- instanciates a SortingIterator object that will pass on a node-set in a
- specific order to the code handling the <code><xsl:apply-templates></code>
- or <code><xsl:for-each></code> element.</p>
-
- </s2><anchor name="sortingiterator-class"/>
- <s2 title="The SortingIterator class">
-
- <p>The SortingIterator class is responsible for sorting nodes encapsulated in
- sort obects. These sort objects must be of a class inheriting from
- NodeSortRecord, a the SortingIterator object needs a factory object providing
- it with the correct type of objects:</p>
-
- <p><img src="sort_objects.gif" alt="sort_objects.gif"/></p>
- <p><ref>Figure 1: SortingIterator</ref></p>
-
- <p>The SortingIterator class is fairly dumb and leaves much of the work to the
- NodeSortRecord class. The iterator gets the NodeSortRecords from the factory
- object and sorts them using quicksort and calling <code>compareTo()</code> on
- pairs of NodeSortRecord objects.</p>
-
- </s2><anchor name="nodesortrecord-class"/>
- <s2 title="The NodeSortRecord class">
-
- <p>The static methods in the Sort class generates a class inheriting from
- NodeSortRecord, with the following overloaded methods:</p>
-
- <ul>
- <li><em>Class Constructor</em></li>
- <ul><li>The class constructor is overloaded to create sort-key global
- tables, such as an array containing the sort order for all the sort keys
- and another array containg all the sort types. Different sort order/types
- can be specified for the different levels of sort keys, but we assume that
- the same language is used for all levels.</li></ul>
-
- <li><code>extractValueFromDOM(int level)</code></li>
- <ul><li>This method is called by the SortingIterator object to extract the
- value for a specific sort key for a node. The SortingIterator will only
- use this method once and will cache the returned value for later use. The
- method will only be called if absultely necessary.</li></ul>
-
- <li><code>compareType(int level)</code></li>
- <ul><li>This method returns the sort type for one sort key level. Returns
- either <code>COMPARE_STRING</code> or <code>COMPARE_NUMERIC</code>.</li></ul>
-
- <li><code>sortOrder(int level)</code></li>
- <ul><li>This method returns the sort order for one sort key level. Returns
- either <code>COMPARE_ASCENDING</code> or <code>COMPARE_DESCENDING</code></li></ul>
-
- <li><code>getCollator(int level)</code></li>
- <ul><li>This method returns a Collator object for language-specific
- string comparisons. The same Collator is used for all levels of the key.
- </li></ul>
- </ul>
-
- <p>The <code>compareTo()</code> method of the NodeSortRecord base class deserves
- a bit of attention. It takes its own node (from the this pointer) and another
- node and compares, if necessary, the values for all sort keys:</p>
-
- <source>
- /**
- * Compare this sort element to another. The first level is checked first,
- * and we proceed to the next level only if the first level keys are
- * identical (and so the key values may not even be extracted from the DOM)
- */
- public int compareTo(NodeSortRecord other) {
- int cmp;
-
- for (int level=0; level<_levels; level++) {
-
- // Compare the two nodes either as numeric or text values
- if (compareType(level) == COMPARE_NUMERIC) {
- final Double our = numericValue(level);
- final Double their = other.numericValue(level);
- if (our == null) return(-1);
- if (their == null) return(1);
- cmp = our.compareTo(their);
- }
- else {
- String our = stringValue(level);
- String their = other.stringValue(level);
- if (our == null) return(-1);
- if (their == null) return(1);
- cmp = getCollator().compare(our,their);
- }
-
- // Return inverse compare value if inverse sort order
- if (cmp != 0) {
- if (sortOrder(level) == COMPARE_DESCENDING)
- return(0 - cmp);
- else
- return(cmp);
- }
-
- }
- return(0);
- }
- </source>
-
- <p>The two methods <code>stringValue(int level)</code> and
- <code>numericValue(int level)</code> return values for one level of the sort key
- of a node. These methods cache these values after they are first read so that
- the <code>DOM.getNodeValue()</code> is only called once. Also, the algorithm
- used for these two methods assure that <code>DOM.getNodeValue()</code> is only
- called when needed. The value for a node's secondary sort key is never
- retrieved if the node can be uniquely identified by its primary key.</p>
-
- </s2><anchor name="nodesortrecordfactory-class"/>
- <s2 title="The NodeSortRecordFactory class">
-
- <p>After the static methods of the Sort class has generated the new class for
- sort objects it generates code that instanciates a new NodeSortRecordFactory
- object. This object is passed as a parameter to SortingIterators constructor
- and is used by the iterator to generate the necessary sort objects.</p>
-
- </s2>
-</s1>
diff --git a/xdocs/sources/xsltc/xsl_unparsed_design.xml b/xdocs/sources/xsltc/xsl_unparsed_design.xml
deleted file mode 100644
index c74d749..0000000
--- a/xdocs/sources/xsltc/xsl_unparsed_design.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 2001 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 2001, Sun
- * Microsystems., http://www.sun.com. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
- <s1 title="unparsed-entity-uri()">
- <ul>
- <li><link anchor="functionality">Functionality</link></li>
- <li><link anchor="implementation">Implementation</link></li>
- </ul>
-
- <anchor name="functionality"/>
- <s2 title="Functionality">
-
-
- <p>The <code>unparsed-entity-uri()</code> function gives access to declarations
- of unparsed entities in the DTD of the source document. If the DTD contains
- the declaration:</p>
-
- <source>
- <!ENTITY mom-picture SYSTEM "http://www.home.com/mom.jpg" NDATA JPEG>
- </source>
-
- <p>the expression <code>unparsed-entity-uri('mom-picture')</code> returns an
- URI for the file <code>mom.jpg</code>.</p>
-
- </s2><anchor name="implementation"/>
- <s2 title="Implementation">
-
- <p>Unparsed entities must be gathered from the XML input document at the time
- when the DOM is built. To achieve this our parser must parse the document DTD
- (if any) and store all data of type NDATA (not XML data) in a
- hashtable in the AbstractTranslet object. All the compiled code for this
- function needs to do is call a method in the translet for retrieving the
- value for the requested element:</p>
-
- <source>
- public String AbstractTranslet.getUnparsedEntity(String entityName);
- </source>
-
- <p>The translet will use the supplied <code>entityName</code> to look up the
- value in the hashtable and then leave the string value on the stack for the
- element that called <code>lang()</code>.</p>
- </s2>
-</s1>
diff --git a/xdocs/sources/xsltc/xsl_whitespace_design.xml b/xdocs/sources/xsltc/xsl_whitespace_design.xml
deleted file mode 100644
index 83b29db..0000000
--- a/xdocs/sources/xsltc/xsl_whitespace_design.xml
+++ /dev/null
@@ -1,342 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 2001 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 2001, Sun
- * Microsystems., http://www.sun.com. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
- <s1 title="<xsl:strip/preserve-space>">
- <ul>
- <li><link anchor="functionality">Functionality</link></li>
- <li><link anchor="identify">Identifying strippable whitespace nodes</link></li>
- <li><link anchor="which">Determining which nodes to strip</link></li>
- <li><link anchor="strip">Stripping nodes</link></li>
- <li><link anchor="filter">Filtering whitespace nodes</link></li>
- </ul>
-
- <anchor name="functionality"/>
- <s2 title="Functionality">
-
- <p>The <code><xsl:strip-space></code> and <code><xsl:preserve-space></code>
- elements are used to control the way whitespace nodes in the source XML
- document are handled. These elements have no impact on whitespace in the XSLT
- stylesheet. Both elements can occur only as top-level elements, possible more
- than once, and the elements are always empty</p>
-
- <p>Both elements take one attribute "elements" which contains a
- whitespace separated list of named nodes which should be or preserved
- stripped from the source document. These names can be on one of these three
- formats (NameTest format):</p>
-
- <ul>
- <li>
- All whitespace nodes:
- <code>elements="*"</code>
- </li>
- <li>
- All whitespace nodes with a namespace:
- <code>elements="<namespace>:*"</code>
- </li>
- <li>
- Specific whitespace nodes: <code>elements="<qname>"</code>
- </li>
- </ul>
-
- </s2><anchor name="identify"/>
- <s2 title="Identifying strippable whitespace nodes">
-
- <p>The DOM detects all text nodes and assigns them the type <code>TEXT</code>.
- All text nodes are scanned to detect whitespace-only nodes. A text-node is
- considered a whitespace node only if it consist entirely of characters from
- the set { 0x09, 0x0a, 0x0d, 0x20 }. The DOM implementation class has a static
- method used to detect such nodes:</p>
-
-<source>
- private static final boolean isWhitespaceChar(char c) {
- return c == 0x20 || c == 0x0A || c == 0x0D || c == 0x09;
- }
-</source>
-
- <p>The characters are checked in probable order.</p>
-
- <p> The DOM has a bit-array that is used to tag text-nodes as strippable
- whitespace nodes:</p>
-
- <source>private int[] _whitespace;</source>
-
- <p>There are two methods in the DOM implementation class for accessing this
- bit-array: <code>markWhitespace(node)</code> and <code>isWhitespace(node)</code>.
- The array is resized together with all other arrays in the DOM by the
- <code>DOM.resizeArrays()</code> method. The bits in the array are set in the
- <code>DOM.maybeCreateTextNode()</code> method. This method must know whether
- the current node is a located under an element with an
- <code>xml:space="<value>"</code> attribute in the DOM, in which
- case it is not a strippable whitespace node.</p>
-
- <p>An auxillary class, WhitespaceHandler, is used for this purpose. The class
- works in a way as a stack, where you "push" a new strip/preserve setting
- together with the node in which this setting was determined. This means that
- for every time the DOM builder encounters an <code>xml:space</code> attribute
- it will invoke a method on an instance of the WhitespaceHandler class to
- signal that a new preserve/strip setting has been encountered. This is done
- in the <code>makeAttributeNode()</code> method. The whitespace handler stores the
- new setting and pushes the current element node on its stack. When the
- DOM builder closes up an element (in <code>endElement()</code>), it invokes
- another method of the whitespace handler to check if the strip/preserve
- setting is still valid. If the setting is now invalid (we're closing the
- element whose node id is on the top of the stack) the handler inverts the
- setting and pops the element node id off the stack. The previous
- strip/preserve setting is then valid, and the id of node where this setting
- was defined is on the top of the stack.</p>
-
- </s2><anchor name="which"/>
- <s2 title="Determining which nodes to strip">
-
- <p>A text node is never stripped unless it contains only whitespace
- characters (Unicode characters 0x09, 0x0A, 0x0D and 0x20). Stripping a text
- node means that the node disappears from the DOM; so that it is never
- included in the output and that it is ignored by all functions such as
- <code>count()</code>. A text node is preserved if any of the following apply:</p>
-
- <ul>
- <li>
- the element name of the parent of the text node is in the set of
- elements listed in <code><xsl:preserve-space></code>
- </li>
- <li>
- the text node contains at least one non-whitespace character
- </li>
- <li>
- an ancenstor of the whitespace text node has an attribute of
- <code>xsl:space="preserve"</code>, and no close ancestor has and
- attribute of <code>xsl:space="default"</code>.
- </li>
- </ul>
-
- <p>Otherwise, the text node is stripped. Initially the set of
- whitespace-preserving element names contains all element names, so the
- default behaviour is to preserve all whitespace text nodes.</p>
-
- <p>This seems simple enough, but resolving conflicts between matching
- <code><xsl:strip-space></code> and <code><xsl:preserve-space></code>
- elements requires a lot of thought. Our first consideration is import
- precedence; the match with the highest import precedence is always chosen.
- Import precedence is determined by the order in which the compared elements
- are visited. (In this case those elements are the top-level
- <code><xsl:strip-space></code> and <code><xsl:preserve-space></code>
- elements.) This example is taken from the XSLT recommendation:</p>
-
- <ul>
- <li>stylesheet A imports stylesheets B and C in that order;</li>
- <li>stylesheet B imports stylesheet D;</li>
- <li>stylesheet C imports stylesheet E.</li>
- </ul>
-
- <p>Then the order of import precedence (lowest first) is D, B, E, C, A.</p>
-
- <p>Our next consideration is the priority of NameTests (XPath spec):</p>
- <ul>
- <li>
- <code>elements="<qname>"</code> has priority 0
- </li>
- <li>
- <code>elements="<namespace>:*"</code> has priority -0.25
- </li>
- <li>
- <code>elements="*"</code> has priority -0.5
- </li>
- </ul>
-
- <p>It is considered an error if the desicion is still ambiguous after this,
- and it is up to the implementors to decide what the apropriate action is.</p>
-
- <p>With all this complexity, the normal usage for these elements is quite
- smiple; either preserve all whitespace nodes but one type:</p>
-
- <source><xsl:strip-space elements="foo"/></source>
-
- <p>or strip all whitespace nodes but one type:</p>
-
- <source>
- <xsl:strip-space elements="*"/>
- <xsl:preserve-space elements="foo"/></source>
-
- </s2><anchor name="strip"/>
- <s2 title="Stripping nodes">
-
- <p>The ultimate goal of our design would be to totally screen all stripped
- nodes from the translet; to either physically remove them from the DOM or to
- make it appear as if they are not there. The first approach will cause
- problems in cases where multiple translets access the same DOM. In the future
- we wish to let translets run within servlets / JSPs with a common DOM cache.
- This DOM cache will keep copies of DOMs in memory to prevent the same XML
- file from being downloaded and parsed several times. This is a scenarios we
- might see:</p>
-
- <p><img src="DOMInterface.gif" alt="DOMInterface.gif"/></p>
- <p><ref>Figure 1: Multiple translets accessing a common pool of DOMs</ref></p>
-
- <p>The three translets running on this host access a common pool of 4 DOMs.
- The DOMs are accessed through a common DOM interface. Translets accessing
- a single DOM will have a DOMAdapter and a single DOMImpl object behind this
- interface, while translets accessing several DOMs will be given a MultiDOM
- and a set of DOMImpl objects.</p>
-
- <p>The translet to the left may want to strip some nodes from the shared DOM
- in the cache, while the other translets may want to preserve all whitespace
- nodes. Our initial thought then is to keep the DOM as it is and somehow
- screen the left-hand translet of all the whitespace nodes it does not want to
- process. There are a few ways in which we can accomplish this:</p>
-
- <ul>
- <li>
- The translet can, prior to starting to traverse the DOM, send a reference
- to the tables containing information on which nodes we want stripped to
- the DOM interface. The DOM interface is then responsible for hiding all
- stripped whitespace nodes from the iterators and the translet. A problem
- with this approach is that we want to omit the DOM interface layer if
- the translet is only accessing a single DOM. The DOM interface layer will
- only be instanciated by the translet if the stylesheet contained a call
- to the <code>document()</code> function.<br/><br/>
- </li>
- <li>
- The translet can provide its iterators with information on which nodes it
- does not want to see. The translet is still shielded from unwanted
- whitespace nodes, but it has the hassle of passing extra information over
- to most iterators it ever instanciates. Note that all iterators do not
- need be aware of whitepspace nodes in this case. If you have a look at
- the figure again you will see that only the first level iterator (that is
- the one closest to the DOM or DOM interface) will have to strip off
- whitespace nodes. But, there may be several iterators that operate
- directly on the DOM ( invoked by code handling XSL functions such as
- <code>count()</code>) and every single one of those will need to be told
- which whitespace nodes the translet does not want to see.<br/><br/>
- </li>
- <li>
- The third approach will take advantage of the fact that not all
- translets will want to strip whitespace nodes. The most effective way of
- removing unwanted whitespace nodes is to do it once and for all, before
- the actual traversal of the DOM starts. This can be done by making a
- clone of the DOM with exlusive-access rights for this translet only. We
- still gain performance from the cache because we do not have to pay the
- cost of the delay caused by downloading and parsing the XML source file.
- The cost we have to pay is the time needed for the actual cloning and the
- extra memory we use.<br/><br/>
- Normally one would imagine the translet (or the wrapper class that
- invokes the translet) calls the DOM cache with just an URL and receives
- a reference to an instanciated DOM. The cache will either have built
- this DOM on-demand or just passed back a reference to an existing tree.
- In this case the DOM would need an extra call that a translet would use
- to clone a DOM, passing the existing DOM reference to the cache and
- recieving a new reference to the cloned DOM. The translet can then do
- whatever it wants with this DOM (the cache need not even keep a reference
- to this tree).
- </li>
- </ul>
-
- <p>We are lucky enough to be able to combine the first two approaches. All
- iterators that directly access the DOM (axis iterators) are instanciated by
- calls to the DOM interface layer (the DOM class). The actual iterators are
- created in the DOM implementation layer (the DOMImpl class). So, we can pass
- references to the preserve/strip whitespace tables to the DOM, and the DOM
- will make sure that all axis iterators return node sets with respect to these
- tables.</p>
- </s2><anchor name="filter"/>
- <s2 title="Filtering whitespace nodes">
-
- <p>For each axis iterator and for <code>DOM.makeStringValue()</code> and
- <code>DOM.stringValueAux()</code> we must apply a filter for eliminating all
- unwanted whitespace nodes. To achive this we must build a very efficient
- predicate for determining if the current node should be stripped or not. This
- predicate is built by <code>Whitespace.compilePredicate()</code>. This method is
- static and builds a predicate for a vector of WhitespaceRule objects. (The
- WhitespaceRule class is defined within the Whitespace class.) Each
- WhitespaceRule object contains information for a single element listed
- in an <code><xsl:strip/preserve-space></code> element, and is broken down
- into the following information:</p>
-
- <ul>
- <li>the namespace (can be the default namespace)</li>
- <li>the element name or "<code>*</code>"</li>
- <li>the type of rule; NS:EL, NS:<code>*</code> or <code>*</code></li>
- <li>the priority of the rule (based on import precedence and type)</li>
- <li>the action; either strip or preserver</li>
- </ul>
-
- <p>The Vector of WhitespaceRules is arranged in order of priority and
- redundant rules are removed. A predicate method is then compiled into the
- translet as:</p>
-
-<source>
- public boolean stripSpace(int node);
-</source>
-
- <p>Unfortunately this method cannot be declared static.</p>
-
- <p>When the Stylesheet objectcompiles the <code>topLevel()</code> method of the
- translet it checks for the existance of the <code>stripSpace()</code> method. If
- this method exists the <code>topLevel()</code> will be compiled to pass the
- translet to the DOM as a StripWhitespaceFilter (the translet implements this
- interface when the <code>stripSpace()</code> method is compiled).</p>
-
- <p>All axis iterators and the <code>DOM.makeStringValue()</code> and
- <code>DOM.stringValueAux()</code> methods check for the existance of this filter
- (it is kept in a global variable in the DOM implementation class) and takes
- the appropriate actions. The methods in the DOM for returning axis iterators
- will place a StrippingIterator on top of the axis iterator if the filter is
- present, and the two methods just mentioned will return empty strings for
- whitespace nodes that should be stripped.</p>
-
- </s2>
-</s1>
diff --git a/xdocs/sources/xsltc/xsltc_compiler.xml b/xdocs/sources/xsltc/xsltc_compiler.xml
deleted file mode 100644
index ae4d69d..0000000
--- a/xdocs/sources/xsltc/xsltc_compiler.xml
+++ /dev/null
@@ -1,270 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 2001 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 2001, Sun
- * Microsystems., http://www.sun.com. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
- <s1 title="XSLTC Compiler Design">
- <ul>
- <li><link anchor="overview">Compiler Overview</link></li>
- <li><link anchor="ast">Building an Abstract Syntax Tree</link></li>
- <li><link anchor="typecheck">Type-check and Cast Expressions</link></li>
- <li><link anchor="compile">Code generation</link></li>
- </ul>
-
- <anchor name="overview"/>
- <s2 title="Compiler overview">
-
- <p>The input stylesheet is parsed using the SAX 1-based parser from Sun's
- Project X:</p>
- <ul>
- <li><code>com.sun.xml.parser.Parser</code></li>
- </ul>
-
- <p>This parser builds a DOM from the stylesheet document, and hands this
- DOM over to the compiler. The compiler uses its own specialised parser to
- parse XPath expressions and patterns:</p>
- <ul>
- <li><code>com.sun.xslt.compiler.XPathParser</code></li>
- </ul>
- <p>Both parsers are encapsulated in XSLTC's parser class:</p>
- <ul>
- <li><code>com.sun.xslt.compiler.Parser</code></li>
- </ul>
-
- </s2><anchor name="ast"/>
- <s2 title="Building an Abstract Syntax Tree">
- <ul>
- <li><link anchor="mapping">Mapping stylesheet elements to Java classes</link></li>
- <li><link anchor="domxsl">Building a DOM tree from the input XSL file</link></li>
- </ul>
- <p>The SAX parser builds a standard W3C DOM from the source stylesheet.
- This DOM does not contain all the information needed to represent the
- whole stylesheet. ( Remember that XSL is two languages; XML and XPath.
- The DOM only covers XML. ) The compiler uses the DOM to build an
- abstract syntax tree (AST) that contains all the nodes from the DOM, plus
- additional nodes for the XPath expressions.</p>
- <anchor name="mapping"/>
- <s3 title="Mapping stylesheets elements to Java classes">
- <p>Each XSL element is represented by a class in the
- <code>com.sun.xslt.compiler</code> package. The Parser class contains a
- Hashtable that that maps XSL instructions to classes that inherit from a
- common parent class 'Instruction' (which again inherits from
- 'SyntaxTreeNode'). This mapping is set up in the <code>initClasses()</code> method:</p>
-<source> private void initStdClasses() {
- try {
- initStdClass("template", "Template");
- initStdClass("param", "Param");
- initStdClass("with-param", "WithParam");
- initStdClass("variable", "Variable");
- initStdClass("output", "Output");
- :
- :
- :
- }
- }
-
- private void initClass(String elementName, String className)
- throws ClassNotFoundException {
- _classes.put(elementName,
- Class.forName(COMPILER_PACKAGE + '.' + className));
- }</source>
- </s3><anchor name="domxsl"/>
- <s3 title="Building a DOM tree from the input XSL file">
- <p>The parser instanciates a DOM that holds the input XSL stylesheet. The
- DOM can only handle XML files and will not break up and identify XPath
- patterns/expressions (these are stored as attributes to the various
- nodes in the tree) or calls to XSL functions(). Each XSL instruction gets
- its own node in the DOM, and the XPath patterns/expressions are stored as
- attributes of these nodes. A stylesheet looking like this:</p>
-<source>
- <xsl:stylesheet .......>
- <xsl:template match="chapter">
- <xsl:text>Chapter</xsl:text>
- <xslvalue-of select=".">
- </xsl:template>
- </xsl>stylesheet>
-</source>
- <p>will be stored in the DOM as indicated in the following picture:</p>
- <p><img src="compiler_DOM.gif" alt="compiler_DOM.gif"/></p>
- <p><ref>Figure 1: DOM containing XSL stylesheet</ref></p>
- <p>The pattern '<code>match="chapter"</code>' and the expression
- '<code>select="."</code>' are stored as attributes for the nodes
- '<code>xsl:template</code>' and '<code>xsl:value-of</code>' respectively.
- These attributes are accessible through the DOM interface.</p>
- </s3>
- <s3 title="Creating the Abstract Syntax Tree from the DOM">
- <p>What we have to do next is to create a tree that also holds the XSL
- specific elements; XPath expressions and patterns (with possible filters)
- and calls to XSL functions. This is done by parsing the DOM and creating an
- instance of a subclass of 'SyntaxTreeNode' for each node in the DOM. A node
- in the DOM containing an XSL instruction (for example, "xsl:template") results in an
- instance of the correspoding class derived from the HashTable created by
- the parser (in this case in instance of the 'Template' class).</p>
-
- <p>Each class that inherits SyntaxTreeNode has a vector called
- '<code>_contents</code>' that holds references to all the children of the node
- (if any). Each node has a method called '<code>parseContents()</code>'. It is
- the responsibility of this method to parse any XPath expressions/patterns
- that are expected and found in the node's attributes. The XPath patterns
- and instructions are tokenised using the auto-generated class 'XPathParser'
- (generated using JavaCup and JLex). The tokenised expressions/patterns
- will result in a small sub-tree owned by the syntax tree node.</p>
-
- <p>XSL nodes holding expressions has a pointer called '<code>_select</code>' that
- points to a sub-tree representing the expression. This can be seen for
- instance in the 'Template' class:</p>
- <p><img src="compiler_AST.gif" alt="compiler_AST.gif"/></p>
- <p><ref>Fiugre 2: Sample Abstract Syntax Tree</ref></p>
- <p>In this example _select only points to a single node. In more complex
- expressions the pointer will point to an whole sub-tree.</p>
- </s3>
- </s2><anchor name="typecheck"/>
- <s2 title="Type-check and Cast Expressions">
- <p>In many cases we will need to typecast the top node in the expression
- sub-tree to suit the expected result-type of the expression, or to typecast
- child nodes to suit the allowed types for the various operators in the
- expression. This is done by calling 'typeCheck()' on the root-node in the
- XSL tree. Each SyntaxTree node is responsible for its own type checking
- (ie. the <code>typeCheck()</code> method must be overridden). Let us say that
- our pattern was:</p>
- <p><code><xsl:value-of select="1+2.73"/></code></p>
- <p><img src="typecast.gif" alt="typecast.gif"/></p>
- <p><ref>Figure 3: XPath expression type conflict</ref></p>
- <p>The number 1 is an integer, and the number 2.73 is a real number, so the
- 1 has to be promoted to a real. This is done ny inserting a new node between
- the [1] and the [+]. This node will convert the 1 to a real number:</p>
- <p><img src="cast_expression.gif" alt="cast_expression.gif"/></p>
- <p><ref>Figure 4: Type casting</ref></p>
-
- <p>The inserted node is an object of the class CastExpr. The SymbolTable
- that was instanciated in (1) is used to determine what casts are needed for
- the various operators and what return types the various expressions will
- have.</p>
-
- </s2><anchor name="compile"/>
- <s2 title="Code generation">
- <ul>
- <li><link anchor="toplevelelem">Compiling top-level elements</link></li>
- <li><link anchor="templatecode">Compiling template code</link></li>
- <li><link anchor="instrfunc">Compiling XSL instructions and functions</link></li>
- </ul>
- <p>A general rule is that all classes that represent elements in the XSL
- tree/document, i.e., classes that inherit from SyntaxTreeNode, output
- bytecode in the 'translate()' method.</p>
- <anchor name="toplevelelem"/>
- <s3 title="Compiling top-level elements">
- <p>The bytecode that handles top-level elements must be generated before any
- other code. The '<code>translate()</code>' method in these classes are mainly
- called from these methods in the Stylesheet class:</p>
-
-<source> private String compileBuildKeys(ClassGenerator classGen);
- private String compileTopLevel(ClassGenerator classGen, Enumeration elements);
- private void compileConstructor(ClassGenerator classGen, Output output);</source>
-
- <p>These methods handle most top-level elements, such as global variables
- and parameters, <code><xsl:output></code> and
- <code><xsl:decimal-format></code> instructions.</p>
- </s3><anchor name="templatecode"/>
- <s3 title="Compiling template code">
- <p>All XPath patterns in <code><xsl:apply-template></code> instructions
- are converted into numeric values (known as the pattern's kernel 'type').
- All templates with identical pattern kernel types are grouped together and
- inserted into a table with its assigned type. (This table is found in the
- Mode class. There will be one such table for each mode that is used in the
- stylesheet). This table is used to build a big <code>switch()</code> statement
- in the translet's <code>applyTemplates()</code> method. This method is initially
- called with the root node of the input document.</p>
- <p>The <code>applyTemplates()</code> method determines the node's type and passes
- this type to the <code>switch()</code> statement to look up the matching
- template.</p>
-
- <p>There may be several templates that share the same pattern kernel type.
- Here are a few examples of templates with patterns that all have the same
- kernel type:</p>
-
-<source> <xsl:template match="A/C">
- <xsl:template match="A/B/C">
- <xsl:template match="A | C"></source>
-
- <p>All these templates will be grouped under the type for <code><C></code>
- and will all get the same kernel type (the type for <code>"C"</code>). The last
- template will be grouped both under <code>"C"</code> and <code>"A"</code>. If the
- type identifier for <code>"C"</code> in this case is 8, all these templates will
- be put under <code>case 8:</code> in <code>applyTemplates()</code>'s big
- <code>switch()</code> statement. The Mode class will insert extra code to choose
- which template code to invoke.</p>
- </s3><anchor name="instrfunc"/>
- <s3 title="Compiling XSL instructions and functions">
-
- <p>The template code is generated by calling <code>translate()</code> on each
- Template object in the abstract syntax tree. This call will be propagated
- down the tree and every element will output the bytecodes necessary to
- complete its task.</p>
-
- <p>Each node will call 'translate()' on its children, and possibly on
- objects representing the node's XPath expressions, before outputting its
- own bytecode. In that way the correct sequence of instructions is generated.
- Each one of the child nodes is responsible of creating code that leaves the
- node's output value (if any) on the stack. The typical procedure for the
- parent node is to create code that consumes these values off the stack and
- then leave its own output on the stack for its parent.</p>
-
- <p>The tree-structure of the stylesheet is in this way closely tied with
- the stack-based JVM. The design does not offer any obvious way of extending
- the compiler to output code for other VMs or processors.</p>
- </s3>
- </s2>
-</s1>
\ No newline at end of file
diff --git a/xdocs/sources/xsltc/xsltc_dom.xml b/xdocs/sources/xsltc/xsltc_dom.xml
deleted file mode 100644
index 93557dd..0000000
--- a/xdocs/sources/xsltc/xsltc_dom.xml
+++ /dev/null
@@ -1,483 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 2001 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 2001, Sun
- * Microsystems., http://www.sun.com. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-<s1 title="XSLTC Internal DOM">
- <ul>
- <li><link anchor="functionality">General functionlaity</link></li>
- <li><link anchor="components">Components of the internal DOM</link></li>
- <li><link anchor="structure">Internal structure</link></li>
- <li><link anchor="navigation">Tree navigation</link></li>
- <li><link anchor="namespaces">Namespaces</link></li>
- <li><link anchor="w3c">W3C DOM2 navigation support</link></li>
- <li><link anchor="adapter">The DOM adapter - DOMAdapter</link></li>
- <li><link anchor="multiplexer">The DOM multiplexer - MultiDOM</link></li>
- <li><link anchor="builder">The DOM builder - DOMImpl$DOMBuilder</link></li>
- </ul>
-
- <anchor name="functionality"/>
- <s2 title="General functionality">
- <p>The internal DOM gives the translet access to the XML document(s) it has
- to transform. The interface to the internal DOM is specified in the DOM.java
- class. This is the interface that the translet uses to access the DOM.
- There is also an interface specified for DOM caches -- DOMCache.java</p>
-
- </s2><anchor name="components"/>
- <s2 title="Components of the internal DOM">
-
- <p>This DOM interface is implemented by three classes:</p>
- <ul>
- <li><em>org.apache.xalan.xsltc.dom.DOMImpl</em><br/><br/>
- This is the main DOM class. An instance of this class contains the nodes
- of a <em>single</em> XML document.<br/>br/>
- </li>
- <li><em>org.apache.xalan.xsltc.dom.MultiDOM</em><br/><br/>
- This class is best described as a DOM multiplexer. XSLTC was initially
- designed to operate on a single XML document, and the initial DOM and
- the DOM interface were designed and implemented without the
- <code>document()</code> function in mind. This class will allow a translet
- to access multiple DOMs through the original DOM interface.<br/><br/>
- </li>
- <li><em>org.apache.xalan.xsltc.dom.DOMAdapter</em><br/>br/>
- The DOM adapter is a mediator between a DOMImpl or a MultiDOM object and
- a single translet. A DOMAdapter object contains mappings and reverse
- mappings between node types in the DOM(s) and node types in the translet.
- This mediator is needed to allow several translets access to a single DOM.
- <br/>br/>
- </li>
- <li><em>org.apache.xalan.xsltc.dom.DocumentCache</em><br/>br/>
- A sample DOM cache (implementing DOMCache) that is used with our sample
- transformation applications.
- </li>
- </ul>
-
- <p><img src="DOMInterface.gif" alt="DOMInterface.gif"/></p>
- <p><ref>Figure 1: Main components of the internal DOM</ref></p>
-
- <p>The figure above shows how several translets can access one or more
- internal DOM from a shared pool of cached DOMs. A translet can also access a
- DOM tree outside of a cache. The Stylesheet class that represents the XSL
- stylesheet to compile contains a flag that indicates if the translet uses the
- <code>document()</code> function. The code compiled into the translet will act
- accordingly and instanciate a MultiDOM object if needed (this code is compiled
- in the compiler's <code>Stylesheet.compileTransform()</code> method).</p>
-
- </s2><anchor name="structure"/>
- <s2 title="Internal Structure">
- <ul>
- <li><link anchor="node-id">Node identification</link></li>
- <li><link anchor="element-nodes">Element nodes</link></li>
- <li><link anchor="attribute-nodes">Attribute nodes</link></li>
- <li><link anchor="text-nodes">Text nodes</link></li>
- <li><link anchor="comment-nodes">Comment nodes</link></li>
- <li><link anchor="pi"></link>Processing instructions</li>
- </ul>
- <anchor name="node-id"/>
- <s3 title="Node identifation">
-
- <p>Each node in the DOM is represented by an integer. This integer is an
- index into a series of arrays that describes the node. Most important is
- the <code>_type[]</code> array, which holds the (DOM internal) node type. There
- are some general node types that are described in the DOM.java interface:</p>
-
-<source>
- public final static int ROOT = 0;
- public final static int TEXT = 1;
- public final static int UNUSED = 2;
- public final static int ELEMENT = 3;
- public final static int ATTRIBUTE = 4;
- public final static int PROCESSING_INSTRUCTION = 5;
- public final static int COMMENT = 6;
- public final static int NTYPES = 7;
-</source>
-
- <p>Element and attribute nodes will be assigned types based on their expanded
- QNames. The <code>_type[]</code> array is used for this:</p>
-
-<source>
- int type = _type[node]; // get node type
-</source>
-
- <p>The node type can be used to look up the element/attribute name in the
- element/attribute name array <code>_namesArray[]</code>:</p>
-
-<source>
- String name = _namesArray[type-NTYPES]; // get node element name
-</source>
-
- <p>The resulting string contains the full, expanded QName of the element or
- attribute. Retrieving the namespace URI of an element/attribute is done in a
- very similar fashion:</p>
-
-<source>
- int nstype = _namespace[type-NTYPES]; // get namespace type
- String namespace = _nsNamesArray[nstype]; // get node namespace name
-</source>
- </s3><anchor name="element-nodes"/>
- <s3 title="Element nodes">
-
- <p>The contents of an element node (child nodes) can be identified using
- the <code>_offsetOrChild[]</code> and <code>_nextSibling[]</code> arrays. The
- <code>_offsetOrChild[]</code> array will give you the first child of an element
- node:</p>
-
-<source>
- int child = _offsetOrChild[node]; // first child
- child = _nextSibling[child]; // next child
-</source>
-
- <p>The last child will have a "<code>_nextSibling[]</code>" of 0 (zero).
- This value is OK since the root node (the 0 node) will not be a child of
- any element.</p>
-
- </s3><anchor name="attribute-nodes"/>
- <s3 title="Attribute nodes">
-
- <p>The first attribute node of an element is found by a lookup in the
- <code>_lengthOrAttr[]</code> array using the node index:</p>
-
-<source>
- int attribute = _offsetOrChild[node]; // first attribute
- attribute = _nextSibling[attribute]; // next attribute
-</source>
-
- <p>The names of attributes are contained in the <code>_namesArray[]</code> just
- like the names of element nodes. The value of attributes are store the same
- way as text nodes:</p>
-
-<source>
- int offset = _offsetOrChild[attribute]; // offset into character array
- int length = _lengthOrAttr[attribute]; // length of attribute value
- String value = new String(_text, offset, length);
-</source>
- </s3><anchor name="text-nodes"/>
- <s3 title="Text nodes">
-
- <p>Text nodes are stored identically to attribute values. See the previous
- section on <link anchor="attribute-nodes">attribute nodes</link>.</p>
- </s3><anchor name="comment-nodes"/>
- <s3 title="Comment nodes">
-
- <p>The internal DOM does currently <em>not</em> contain comment nodes. Yes, I
- am quite aware that the DOM has a type assigned to comment nodes, but comments
- are still not inserted into the DOM.</p>
- </s3><anchor name="pi"/>
- <s3 title="Processing instructions">
-
- <p>Processing instructions are handled as text nodes. These nodes are stored
- identically to attribute values. See the previous section on
- <link anchor="attribute-nodes">attribute nodes</link>.</p>
-
- </s3></s2><anchor name="navigation"/>
- <s2 title="Tree navigation">
-
- <p>The DOM implementation contains a series of iterator that implement the
- XPath axis. All these iterators implement the NodeIterator interface and
- extend the NodeIteratorBase base class. These iterators do the job of
- navigating the tree using the <code>_offsetOrChild[]</code>, <code>_nextSibling</code>
- and <code>_parent[]</code> arrays. All iterators that handles XPath axis are
- implemented as a private inner class of DOMImpl. The translet uses a handful
- of methods to instanciate these iterators:</p>
-
-<source>
- public NodeIterator getIterator();
- public NodeIterator getChildren(final int node);
- public NodeIterator getTypedChildren(final int type);
- public NodeIterator getAxisIterator(final int axis);
- public NodeIterator getTypedAxisIterator(final int axis, final int type);
- public NodeIterator getNthDescendant(int node, int n);
- public NodeIterator getNamespaceAxisIterator(final int axis, final int ns);
- public NodeIterator orderNodes(NodeIterator source, int node);
-</source>
-
- <p>There are a few iterators in addition to these, such as sorting/ordering
- iterators and filtering iterators. These iterators are implemented in
- separate classes and can be instanciated directly by the translet.</p>
-
- </s2><anchor name="namespaces"/>
- <s2 title="Namespaces">
-
- <p>Namespace support was added to the internal DOM at a late stage, and the
- design and implementation of the DOM bears a few scars because of this.
- There is a separate <link idref="xsltc_namespace">design
- document</link> that covers namespaces.</p>
-
- </s2><anchor name="w3c"/>
- <s2 title="W3C DOM2 navigation support">
-
- <p>The DOM has a few methods that give basic W3C-type DOM navigation. These
- methods are:</p>
-
-<source>
- public Node makeNode(int index);
- public Node makeNode(NodeIterator iter);
- public NodeList makeNodeList(int index);
- public NodeList makeNodeList(NodeIterator iter);
-</source>
-
- <p>These methods return instances of inner classes of the DOM that implement
- the W3C Node and NodeList interfaces.</p>
-
- </s2><anchor name="adapter"/>
- <s2 title="The DOM adapter - DOMAdapter">
- <ul>
- <li><link anchor="translet-dom">Translet/DOM type mapping</link></li>
- <li><link anchor="whitespace">Whitespace text-node stripping</link></li>
- <li><link anchor="method-mapping">Method mapping</link></li>
- </ul>
- <anchor name="translet-dom"/>
- <s3 title="Translet/DOM type mapping">
-
- <p>The DOMAdapter class performs the mappings between DOM and translet node
- types, and vice versa. These mappings are necessary in order for the translet
- to correctly identify an element/attribute in the DOM and for the DOM to
- correctly identify the element/attribute type of a typed iterator requested
- by the translet. Note that the DOMAdapter also maps translet namespace types
- to DOM namespace types, and vice versa.</p>
-
- <p>The DOMAdapter class has four global tables that hold the translet/DOM
- type and namespace-type mappings. If the DOM knows an element as type
- 19, the DOMAdapter will translate this to some other integer using the
- <code>_mapping[]</code> array:</p>
-
-<source>
- int domType = _mapping[transletType];
-</source>
-
- <p>This action will be performed when the DOM asks what type a specific node
- is. The reverse is done then the translet wants an iterator for a specific
- node type. The DOMAdapter must translate the translet-type to the type used
- internally in the DOM by looking up the <code>_reverse[]</code> array:</p>
-
-<source>
- int transletType = _mapping[domType];
-</source>
-
- <p>There are two additional mapping tables: <code>_NSmapping[]</code> and
- <code>_NSreverse[]</code> that do the same for namespace types.</p>
- </s3><anchor name="whitespace"/>
- <s3 title="Whitespace text-node stripping">
-
- <p>The DOMAdapter class has the additional function of stripping whitespace
- nodes in the DOM. This functionality had to be put in the DOMAdapter, as
- different translets will have different preferences for node stripping.</p>
- </s3><anchor name="method-mapping"/>
- <s3 title="Method mapping">
-
- <p>The DOMAdapter class implements the same <code>DOM</code> interface as the
- DOMImpl class. A DOMAdapter object will look like a DOMImpl tree, but the
- translet can access it directly without being concerned with type mapping
- and whitespace stripping. The <code>getTypedChildren()</code> demonstrates very
- well how this is done:</p>
-
-<source>
- public NodeIterator getTypedChildren(int type) {
- // Get the DOM type for the requested typed iterator
- final int domType = _reverse[type];
- // Now get the typed child iterator from the DOMImpl object
- NodeIterator iterator = _domImpl.getTypedChildren(domType);
- // Wrap the iterator in a WS stripping iterator if child-nodes are text nodes
- if ((domType == DOM.TEXT) && (_filter != null))
- iterator = _domImpl.strippingIterator(iterator,_mapping,_filter);
- return(iterator);
- }
-</source>
-
- </s3></s2><anchor name="multiplexer"/>
- <s2 title="The DOM multiplexer - MultiDOM">
-
- <p>The DOM multiplexer class is only used when the compiled stylesheet uses
- the <code>document()</code> function. An instance of the MultiDOM class also
- implements the DOM interface, so that it can be accessed in the same way
- as a DOMAdapter object.</p>
-
- <p>A node in the DOM is identified by an integer. The first 8 bits of this
- integer are used to identify the DOM in which the node belongs, while the
- lower 24 bits are used to identify the node within the DOM:</p>
- <table>
- <tr>
- <td>31-24</td>
- <td>23-16</td>
- <td>16-8</td>
- <td>7-0</td>
- </tr>
- <tr>
- <td>DOM id</td>
- <td colspan="3">node id</td>
- </tr>
- </table>
-
- <p>The DOM multiplexer has an array of DOMAdapter objects. The topmost 8
- bits of the identifier is used to find the correct DOM from the array. Then
- the lower 24 bits are used in calls to methods in the DOMAdapter object:</p>
-
-<source>
- public int getParent(int node) {
- return _adapters[node>>>24].getParent(node & 0x00ffffff) | node & 0xff000000;
- }
-</source>
-
- <p>Note that the node identifier returned by this method has the same upper 8
- bits as the input node. This is why we <code>OR</code> the result from
- <code>DOMAdapter.getParent()</code> with the top 8 bits of the input node.</p>
-
- </s2><anchor name="builder"/>
- <s2 title="The DOM builder - DOMImpl$DOMBuilder">
- <ul>
- <li><link anchor="startelement">startElement()</link></li>
- <li><link anchor="endelement">endElement()</link></li>
- <li><link anchor="startprefixmapping">startPrefixMapping()</link></li>
- <li><link anchor="endprefixmapping">endPrefixMapping()</link></li>
- <li><link anchor="characters">characters()</link></li>
- <li><link anchor="startdocument">startDocument()</link></li>
- <li><link anchor="enddocument">endDocument()</link></li>
- </ul>
-
- <p>The DOM builder is an inner class of the DOM implementation. The builder
- implements the SAX2 <code>ContentHandler</code> interface and populates the DOM
- by receiving SAX2 events from a SAX2 parser (presently xerces). An instance
- of the DOM builder class can be retrieved from <code>DOMImpl.getBuilder()</code>
- method, and this handler can be set as an XMLReader's content handler:</p>
-
-<source>
- final SAXParserFactory factory = SAXParserFactory.newInstance();
- final SAXParser parser = factory.newSAXParser();
- final XMLReader reader = parser.getXMLReader();
- final DOMImpl dom = new DOMImpl();
- reader.setContentHandler(dom.getBuilder());
-</source>
-
- <p>The DOM builder will start to populate the DOM once the XML parser starts
- generating SAX2 events:</p>
- <anchor name="startelement"/>
- <s3 title="startElement()">
-
- <p>This method can be called in one of two ways; either with the expanded
- QName (the element's separate uri and local name are supplied) or as a
- normal QName (one String on the format prefix:local-name). The DOM stores
- elements as expanded QNames so it needs to know the element's namespace URI.
- Since the URI is not supplied with this call, we have to keep track of
- namespace prefix/uri mappings while we're building the DOM. See
- <code><link anchor="startprefixmapping">startPrefixMapping()</link></code> below for details on
- namespace handling.</p>
-
- <p>The <code>startElement()</code> inserts the element as a child of the current
- parent element, creates attribute nodes for all attributes in the supplied
- "<code>Attributes</code>" attribute list (by a series of calls to
- <code>makeAttributeNode()</code>), and finally creates the actual element node
- (by calling <code>internElement()</code>, which inserts a new entry in the
- <code>_type[]</code> array).</p>
- </s3><anchor name="endelement"/>
- <s3 title="endElement()">
-
- <p>This method does some cleanup after the <code>startElement()</code> method,
- such as revering <code>xml:space</code> settings and linking the element's
- child nodes.</p>
- </s3><anchor name="startprefixmapping"/>
- <s3 title="startPrefixMapping()">
-
- <p>This method is called for each namespace declaration in the source
- document. The parser should call this method before the prefix is referenced
- in a QName that is passed to the <code>startElement()</code> call. Namespace
- prefix/uri mappings are stored in a Hashtable structure. Namespace prefixes
- are used as the keys in the Hashtable, and each key maps to a Stack that
- contains the various URIs that the prefix maps to. The URI on top of the
- stack is the URI that the prefix currently maps to.</p>
-
-
- <p><img src="namespace_stack.gif" alt="namespace_stack.gif"/></p>
- <p><ref>Figure 2: Namespace handling in the DOM builder</ref></p>
-
-
- <p>Each call to <code>startPrefixMapping()</code> results in a lookup in the
- Hashtable (using the prefix), and a <code>push()</code> of the URI onto the
- Stack that the prefix maps to.</p>
- </s3><anchor name="endprefixmapping"/>
- <s3 title="endPrefixMapping()">
-
- <p>A namespace prefix/uri mapping is closed by locating the Stack for the
- prefix, and then <code>pop()</code>'ing the topmost URI off this Stack.</p>
- </s3><anchor name="characters"/>
- <s3 title="characters()">
-
- <p>Text nodes are stored as simple character sequences in the character array
- <code>_text[]</code>. The start and lenght of a node's text can be determined by
- using the node index to look up <code>_offsetOrChild[]</code> and
- <code>_lengthOrAttribute[]</code>.</p>
-
- <p>We want to re-use character sequences if two or more text nodes have
- identical content. This can be achieved by having two different text node
- indexes map to the same character sequence. The <code>maybeReuseText()</code>
- method is always called before a new character string is stored in the
- <code>_text[]</code> array. This method will locate the offset of an existing
- instance of a character sequence.</p>
- </s3><anchor name="startdocument"/>
- <s3 title="startDocument()">
-
- <p>This method initialises a bunch of data structures that are used by the
- builder. It also pushes the default namespace on the namespace stack (so that
- the "" prefix maps to the <code>null</code> namespace).</p>
- </s3><anchor name="enddocument"/>
- <s3 title="endDocument()">
-
- <p>This method builds the <code>_namesArray[]</code>, <code>_namespace[]</code>
- and <code>_nsNamesArray[]</code> structures from temporary datastructures used
- in the DOM builder.</p>
-
- </s3>
- </s2>
-</s1>
\ No newline at end of file
diff --git a/xdocs/sources/xsltc/xsltc_namespace.xml b/xdocs/sources/xsltc/xsltc_namespace.xml
deleted file mode 100644
index a9ab323..0000000
--- a/xdocs/sources/xsltc/xsltc_namespace.xml
+++ /dev/null
@@ -1,606 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 2001 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 2001, Sun
- * Microsystems., http://www.sun.com. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
- <s1 title="XSLTC and Namespaces">
- <ul>
- <li><link anchor="functionality">Functionality</link></li>
- <li><link anchor="overview">Namespace overview</link></li>
- <li><link anchor="NSA">The DOM & namespaces</link></li>
- <li><link anchor="NSB">Namespaces in the XSL stylesheet</link></li>
- <li><link anchor="NSC">Namespaces in the output document</link></li>
- </ul>
- <anchor name="functionality"/>
- <s2 title="Functionality">
-
- <p>Namespaces are used when an XML documents has elements have the same
- name, but are from different contexts, and thus have different meanings
- and interpretations. For instance, a <code><TITLE></code> element can
- be a HTML title element in one part of the XML document, while it in other
- parts of the document the <code><TITLE></code> element is used for
- encapsulating the title of a play or a book. This sort of confusion is
- very common when reading XML source from multiple documents, but can also
- occur within a single document.</p>
-
- <p>Namespaces have three very important properties: a name, a prefix (an
- alias for its name) and a scope. Namespaces are declared as attributes of
- almost any node in an XML document. The declaration looks like this:</p>
-
-<source>
- <element xmlns:prefix="http://some.site/spec">....</element>
-</source>
-
- <p>The <code>"xmlns"</code> tells that this is a namespace declaration. The
- scope of the namespace declaration is the element in which it is defined
- and all the children of that element.The prefix is the local alias we use
- for referencing the namespace, and the URL (it can be anything, really) is
- the name/definition of the namespace. Note that even though the namespace
- definition is normally an URL, it does not have to point to anything. It
- is recommended that it points to a page that describes the elements in the
- namespace, but it does not have to. The prefix can be just about anything
- - or nothing (in which case it is the default namespace). Any prefix,
- including the empty prefix for the default namespace, can be redefined to
- refer to a different namespace at any time in an XML document. This is
- more likely to happen to the default namespace than any other prefix. Here
- is an example of this:</p>
-
- <anchor name="xml_sample_1"/>
-<source>
- <?xml version="1.0"?>
-
- <employees xmlns:postal="http://postal.ie/spec-1.0"
- xmlns:email="http://www.w3c.org/some-spec-3.2">
- <employee>
- <name>Bob Worker</name>
- <postal:address>
- <postal:street>Nassau Street</postal:street>
- <postal:city>Dublin 3</postal:city>
- <postal:country>Ireland</postal:country>
- </postal:address>
- <email:address>bob.worker@hisjob.ie</email:address>
- </employee>
- </employees>
-</source>
-
- <p>This short document has two namespace declarations, one with the prefix
- <code>"postal"</code> and another with the prefix <code>"email"</code>. The
- prefixes are used to distinguish between elements for e-mail addresses and
- regular postal addresses. In addition to these two namespaces there is also
- an initial (unnamed) default namespace being used for the
- <code><name></code> and <code><employee></code> tags. The scope of the
- default namespace is in this case the whole document, while the scope of
- the other two declared namespaces is the <code><employees></code>
- element and its children.</p>
-
- <p>By changing the default namespace we could have made the document a
- little bit simpler and more readable:</p>
-
- <anchor name="xml_sample_2"/>
-<source>
- <?xml version="1.0"?>
-
- <employees xmlns:email="http://www.w3c.org/some-spec-3.2">
- <employee>
- <name>Bob Worker</name>
- <address xmlns="http://postal.ie/spec-1.0">
- <street>Nassau Street</street>
- <city>Dublin 3</city>
- <country>Ireland</country>
- </address>
- <email:address>bob.worker@hisjob.ie</email:address>
- </employee>
- </employees>
-</source>
-
- <p>The default namespace is redefined for the <code><address></code> node
- and its children, so there is no need to specify the street as
- <code><postal:street></code> - just plain <code><street></code> is
- sufficient. Note that this also applies to the <code><address></code>
- where the namespace is first defined. This is in effect a redefinition of
- the default namespace.</p>
- </s2><anchor name="overview"/>
- <s2 title="Namespace overview">
-
- <p>Namespaces will have to be handled in three separate parts of the XSLT
- compiler:</p>
-
- <anchor name="all_namespaces"/>
- <p><img src="all_namespaces.gif" alt="all_namespaces.gif"/></p>
- <p><ref>Figure 1: Namespace handlers in the XSLTC</ref></p>
-
- <p>The most obvious is the namespaces in the source XML document
- (marked <link anchor="NSA">"NS A"</link> in figure 1). These namespaces will be
- handled by our DOM implementation class. The source XSL stylesheet also
- has its own set of namespaces (<link idref="NSB">"NS B"</link>) - one of which
- is the XSL namespace. These namespaces will be handled at run-time and
- whatever information that is needed to process there should be compiled
- into the translet. There is also a set of namespaces that will be used in
- the resulting document (<link idref="NSC">"NS C"</link>). This is an
- intersection of the first two. The output document should not contain any
- more namespace declarations than necessary.</p>
-
- </s2><anchor name="NSA"/>
- <s2 title="The DOM & namespaces">
- <ul>
- <li><link anchor="dom-namespace">DOM node types and namespace types</link></li>
- <li><link anchor="assign">Assigning namespace types to DOM nodes</link></li>
- </ul>
- <anchor name="dom-namespace"/>
- <s3 title="DOM node types and namespace types">
-
- <p>Refer to the XSLTC <link idref="xsltc_runtime">runtime
- environment design</link> document for a description of node types before
- proceeding. In short, each node in the our DOM implementation is
- represented by a simple integer. By using this integer as an index into an
- array called <code>_type[]</code> we can find the type of the node.</p>
-
- <p>The type of the node is an integer representing the type of element the
- node is. All elements <code><bob></code> will be given the same type,
- all text nodes will be given the same type, and so on. By using the node
- type as an index an array called <code>_namesArray[]</code> we can find the
- name of the element type - in this case "bob". This code fragment shows
- how you can, with our current implementation, find the name of a node:</p>
-
-<source>
- int node = iterator.getNext(); // get next node
- int type = _type[node]; // get node type
- String name = _namesArray[type]; // get node name
-</source>
-
- <p>We want to keep the one-type-per-node arrangement, since that lets us
- produce fairly efficient code. One type in the DOM maps to one type in
- the compiled translet. What we could do to represent the namespace for
- each node in the DOM is to add a <code>_namespaceType[]</code> array that holds
- namespace types. Each node type maps to a namespace type, and each
- namespace type maps to a namespace name (and a prefix with a limited
- scope):</p>
-
- <anchor name="type_mappings"/>
- <p><img src="type_mappings.gif" alt="type_mappings.gif"/></p>
- <p><ref>Figure 2: Mapping between node types/names, namespace types/names</ref></p>
-
- <p>This code fragment shows how we could get the namespace name for a node:</p>
-
-<source>
- int node = iterator.getNext(); // get next node
- int type = _type[node]; // get node type
- int nstype = _namespace[type]; // get namespace type
- String name = _namesArray[type]; // get node element name
- String namespace = _nsNamesArray[nstype]; // get node namespace name
-</source>
-
- <p>Note that namespace prefixes are not included here. Namespace prefixes
- are local to the XML document and will be expanded to the full namespace
- names when the nodes are put into the DOM. This, however, is not a trivial
- matter.</p>
- </s3><anchor name="assign"/>
- <s3 title="Assigning namespace types to DOM nodes">
-
- <p>We cannot simply have a single namespace prefix array similar to the
- <code>_namespaceArray[]</code> array for mapping a namespace type to a single
- prefix. This because prefixes can refer to different namespaces depending
- on where in the document the prefixes are being used. In our last example's
- <link idref="xml_sample_2">XML fragment</link> the empty prefix <code>""</code>
- initially referred to the default namespace (the one with no name - just
- like a Clint Eastwood character). Later on in the document the empty
- prefix is changed to refer to a namespace called
- <code>"http://postal.ie/spec-1.0"</code>.</p>
-
- <p>Namespace prefixes are only relevant at the time when the XML document
- is parsed and the DOM is built. Once we have the DOM completed we only need
- a table that maps each node type to a namespace type, and another array of
- all the names of the different namespaces. So what we want to end up with
- is something like this:</p>
-
- <p><img src="dom_namespace1.gif" alt="dom_namespace1.gif"/></p>
- <p><ref>Figure 3: Each namespace references in the DOM gets one entry</ref></p>
-
- <p>The namespace table has one entry for each namespace, nomatter how many
- prefixes were used ro reference this namespace in the DOM. To build this
- array we need a temporary data structure used by the DOM builder. This
- structure is a hashtable - where the various prefixes are used for the
- hash values. The contents of each entry in the table will be a small stack
- where previous meanings of each prefix will be stored:</p>
-
- <p><img src="dom_namespace2.gif" alt="dom_namespace2.gif"/></p>
- <p><ref>Figure 4: Temporary data structure used by the DOM builder</ref></p>
-
- <p>When the first node is encountered we define a new namespace
- <code>"foo"</code> and assign this namespace type/index 1 (the default
- namespace <code>""</code> has index 0). At the same time we use the prefix
- <code>"A"</code> for a lookup in the hashtable. This gives us
- an integer stack used for the prefix <code>"A"</code>. We push the namespace
- type 1 on this stack. From now on, until <code>"A"</code> is pop'ed off this
- stack, the prefix <code>"A"</code> will map to namespace type 1, which
- represents the namespace URI <code>"foo"</code>.</p>
-
- <p>We then encounter the next node with a new namespace definition with
- the same namespace prefix, we create a new namespace <code>"bar"</code> and
- we put that in the namespace table under type 2. Again we use the prefix
- <code>"A"</code> as an entry into the namespace prefix table and we get the
- same integer stack. We now push namespace type 2 on the stack, so that
- namespace prefix <code>"A"</code> maps to namespace URI <code>"bar"</code>. When
- we have traversed this node's children we need to pop the integer off the
- stack, so when we're back at the first node the prefix <code>"A"</code> again
- will point to namespace type 0, which maps to <code>"foo"</code>. To keep
- track of what nodes had what namespace declarations, we use a namespace
- declaration stack:</p>
-
- <p><img src="dom_namespace3.gif" alt="dom_namespace3.gif"/></p>
- <p><ref>Figure 5: Namespace declaration stack</ref></p>
-
- <p>Every namespace declaration is pushed on the namespace declaration
- stack. This stack holds the node index for where the namespace was
- declared, and a reference to the prefix stack for this declaration.
- The <code>endElement()</code> method of the DOMBuilder class will need to
- remove namespace declaration for the node that is closed. This is done
- by first checking the namespace declaration stack for any namespaces
- declared by this node. If any declarations are found these are un-declared
- by poping the namespace prefixes off the respective prefix stack(s), and
- then poping the entry/entries for this node off the namespace declaration
- stack.</p>
-
- <p>The <code>endDocument()</code> method will build an array that contains
- all namespaces used in the source XML document - <code>_nsNamesArray[]</code>
- - which holds the URIs of all refered namespaces. This method also builds
- an array that maps all DOM node types to namespace types. This two arrays
- are accessed through two new methods in the DOM interface:</p>
-
-<source>
- public String getNamespaceName(int node);
- public int getNamespaceType(int node);
-</source>
-
- </s3></s2><anchor name="NSB"/>
- <s2 title="Namespaces in the XSL stylesheet">
- <ul>
- <li><link anchor="store-access">Storing and accessing namespace information</link></li>
- <li><link anchor="mapdom-stylesheet">Mapping DOM namespaces to stylesheet namespaces</link></li>
- <li><link anchor="wildcards">Wildcards and namespaces</link></li>
- </ul>
- <anchor name="store-access"/>
- <s3 title="Storing and accessing namespace information">
- <p>The SymbolTable class has three datastructures that are used to hold
- namespace information:</p>
-
- <ul>
- <li>
- First there is the <code>_namespaces[]</code> Hashtable that maps the names
- of in-scope namespace to their respective prefixes. Each key in the
- Hashtable object has a stack. A new prefix is pushed on the stack for
- each new declaration of a namespace.
- </li>
- <li>
- Then there is the <code>_prefixes[]</code> Hashtable. This has the reverse
- function of the <code>_namespaces[]</code> Hashtable - it maps from
- prefixes to namespaces.
- </li>
- <li>
- There is also a hashtable that is used for implementing the
- <code><xsl:namespace-alias></code> element. The keys in this
- hashtable is taken from the <code>stylesheet-prefix</code> attribute of
- this element, and the resulting prefix (from the <code>result-prefix</code>
- attribute) is used as the value for each key.
- </li>
- </ul>
-
- <p>The SymbolTable class offers 4 methods for accessing these data
- structures:</p>
-
-<source>
- public void pushNamespace(String prefix, String uri);
- public void popNamespace(String prefix);
- public String lookupPrefix(String uri);
- public String lookupNamespace(String prefix);
-</source>
-
- <p>These methods are wrapped by two methods in the Parser class (a Parser
- object alwas has a SymbolTable object):</p>
-<source>
- // This method pushes all namespaces declared within a single element
- public void pushNamespaces(ElementEx element);
- // This method pops all namespaces declared within a single element
- public void popNamespaces(ElementEx element);
-</source>
-
- <p>The translet class has, just like the DOM, a <code>namesArray[]</code>
- structure for holding the expanded QNames of all accessed elements. The
- compiled translet fills this array in its constructor. When the translet
- has built the DOM (a DOMImpl object), it passes the DOM to the a DOM
- adapter (a DOMAdapter object) together with the names array. The DOM
- adapter then maps the translet's types to the DOM's types.</p>
- </s3><anchor name="mapdom-stylesheet"/>
- <s3 title="Mapping DOM namespaces and stylesheet namespaces">
-
- <p>Each entry in the DOM's <code>_namesArray[]</code> is expanded to contain
- the full QName, so that instead of containing <code>prefix:localname</code> it
- will now contain <code>namespace-uri:localname</code>. In this way the expanded
- QName in the translet will match the exanded QName in the DOM. This assures
- matches on full QNames, but does not do much for <code>match="A:*"</code> type
- XPath patterns. This is where our main challenge lies.</p>
- </s3><anchor name="wildcards"/>
- <s3 title="Wildcards and namespaces">
-
- <p>The original implementation of the XSLTC runtime environment would
- only allow matches on "<code>*</code>" and "<code>@*</code>" patterns. This was
- achieved by mapping all elements that could not be mapped to a translet
- type to 3 (DOM.ELEMENT type), and similarly all unknown attributes to
- type 4 (DOM.ATTRIBUTE type). The main <code>switch()</code> statement in
- <code>applyTemplates()</code> would then have a separate "<code>case()</code>"
- for each of these. (Under each <code>case()</code> you might have to check
- for the node's parents in case you were matching on "<code>path/*</code>"-type
- patterns.) This figure shows how that was done:</p>
-
- <anchor name="match_namespace1"/>
- <p><img src="match_namespace1.gif" alt="match_namespace1.gif"/></p>
- <p><ref>Figure 6: Previous pattern matching</ref></p>
-
- <p>The "Node test" box here represents the "<code>switch()</code>" statement.
- The "Node parent test" box represent each "<code>case:</code>" for that
- <code>switch()</code> statement. There is one <code>case:</code> for each know
- translet node type. For each node type we have to check for any parent
- patterns - for instance, for the pattern "<code>/foo/bar/baz</code>", we will
- get a match with <code>case "baz"</code>, and we have to check that the parent
- node is "<code>bar</code>" and that the grandparent is "<code>foo</code>" before
- we can say that we have a hit. The "Element parent test" is the test that
- is done all DOM nodes that do not directly match any translet types. This
- is the test for "<code>*</code>" or "<code>foo/*</code>". Similarly we have a
- "<code>case:</code>" for match on attributes ("<code>@*</code>").</p>
-
- <p>What we now want to achieve is to insert a check for patterns on the
- format "<code>ns:*</code>", "<code>foo/ns:*</code>" or "<code>ns:@*</code>", which
- this figure illustrates:</p>
-
- <anchor name="match_namespace2"/>
- <p><img src="match_namespace2.gif" alt="match_namespace2.gif"/></p>
- <p><ref>Figure 7: Pattern matching with namespace tests</ref></p>
-
-
- <p>Each node in the DOM needs a namespace type as well as the QName type.
- With this type we can match wildcard rules to any specific namespace.
- So after any checks have been done on the whole QName of a node (the type),
- we can match on the namespace type of the node. The main dispatch
- <code>switch()</code> in <code>applyTemplates()</code> must be changed from this:</p>
-
- <source>
- public void applyTemplates(DOM dom, NodeIterator iterator,
- TransletOutputHandler handler) {
-
- // Get next node from iterator
- while ((node = iterator.next()) != END) {
- // Get internal node type
- final int type = DOM.getType(node);
- switch(type) {
- case DOM.ROOT: // Match on "/" pattern
- handleRootNode();
- break;
- case DOM.TEXT: // Handle text nodes
- handleText();
- break;
- case DOM.ELEMENT: // Match on "*" pattern
- handleWildcardElement();
- break;
- case DOM.ATTRIBUTE: // Handle on "@*" pattern
- handleWildcardElement();
- break;
- case nodeType1: // Handle 1st known element type
- compiledCodeForType1();
- break;
- :
- :
- :
- case nodeTypeN: // Handle nth known element type
- compiledCodeForTypeN();
- break;
- default:
- NodeIterator newIterator = DOM.getChildren(node);
- applyTemplates(DOM, newIterator, handler);
- break;
- }
- }
- return;
- }
-</source>
-
- <p>To something like this:</p>
-
- <source>
- public void applyTemplates(DOM dom, NodeIterator iterator,
- TransletOutputHandler handler) {
-
- // Get next node from iterator
- while ((node = iterator.next()) != END) {
-
- // First run check on node type
- final int type = DOM.getType(node);
- switch(type) {
- case DOM.ROOT: // Match on "/" pattern
- handleRootNode();
- continue;
- case DOM.TEXT: // Handle text nodes
- handleText();
- continue;
- case DOM.ELEMENT: // Not handled here!!!
- break;
- case DOM.ATTRIBUTE: // Not handled here!!!
- break;
- case nodeType1: // Handle 1st known element type
- if (compiledCodeForType1() == match) continue;
- break;
- :
- :
- :
- case nodeTypeN: // Handle nth known element type
- if (compiledCodeForTypeN() == match) continue;
- break;
- default:
- break;
- }
-
- // Then run check on namespace type
- final int namespace = DOM.getNamespace(type);
- switch(namespace) {
- case 0: // Handle nodes matching 1st known namespace
- if (handleThisNamespace() == match) continue;
- break;
- case 1: // Handle nodes matching 2nd known namespace
- if (handleOtherNamespace() == match) continue;
- break;
- }
-
- // Finally check on element/attribute wildcard
- if (type == DOM.ELEMENT) {
- if (handleWildcardElement() == match)
- continue;
- else {
- // The default action for elements
- NodeIterator newIterator = DOM.getChildren(node);
- applyTemplates(DOM, newIterator, handler);
- }
- }
- else if (type == DOM.ATTRIBUTE) {
- handleWildcardAttribute();
- continue;
- }
- }
- }
-</source>
-
- <p>First note that the default action (iterate on children) does not hold for
- attributes, since attribute nodes do not have children. Then note that the way
- the three levels of tests are ordered is consistent with the way patterns
- should be prioritised:</p>
-
- <ul>
-
- <li><em>Match on element/attribute types:</em></li>
- <ul>
- <li><code>match="/"</code> - match on the root node</li>
- <li><code>match="B"</code> - match on any B element</li>
- <li><code>match="A/B"</code> - match on B elements with A parent</li>
- <li><code>match="A | B"</code> - match on B or A element</li>
- <li><code>match="foo:B"</code> - match on B element within "foo" namespace</li>
- </ul>
- <li><em>Match on namespace:</em></li>
- <ul>
- <li><code>match="foo:*"</code> - match on any element within "foo" namespace</li>
- <li><code>match="foo:@*"</code> - match on any attribute within "foo" namespace</li>
- <li><code>match="A/foo:*"</code> - match on any element within "foo" namespace with A parent</li>
- <li><code>match="A/foo:@*"</code> - match on any attribute within "foo" namespace with A parent</li>
- </ul>
-
- <li><em>Match on wildcard:</em> </li>
- <ul>
- <li><code>match="*"</code> - match on any element</li>
- <li><code>match="@*"</code> - match on any attribute</li>
- <li><code>match="A/*"</code> - match on any element with A parent</li>
- <li><code>match="A/@*"</code> - match on any attribute with A parent</li>
- </ul>
-
- </ul>
-
- </s3></s2><anchor name="NSC"/>
- <s2 title="Namespaces in the output document">
-
- <p>These are the categories of namespaces that end up in the output
- document:</p>
-
- <ul>
- <li>
- Namespaces used in literal elements/attributes in the stylesheet. These
- namespaces should be declared <em>once</em> before use in the output
- document. These elements are copied to the output document independent
- of namespaces in the input XML document. However, the namespaces can
- be declared using the same prefix, such that a namespace used by a
- literal result element can overshadow a namespace from the DOM.
- </li>
- <li>
- Namespaces from elements in the stylesheet that match elements in the
- DOM. No namespaces from the DOM should be copied to the output document
- unless they are actually referenced in the stylesheet. No namespaces
- from the stylesheet should be copied to the output document unless the
- elements in which they are references match elements in the DOM.
- </li>
- </ul>
-
- <anchor name="output_namespaces1"/>
- <p><img src="output_namespaces1.gif" alt="output_namespaces1.gif"/></p>
- <p><ref>Figure 8: Namespace declaration in the output document</ref></p>
-
- <p>Any literal element that ends up in the output document must declare all
- namespaces that were declared in the <code><xsl:stylesheet<</code>
- element. Exceptions are namespaces that are listed in this element's
- <code>exclude-result-prefixes</code> or <code>extension-element-prefixes</code>
- attributes. These namespaces should only be declared if they are referenced
- in the output.</p>
-
- <p>Literal elements should only declare namespaces when necessary. A
- literal element should only declare a namespace in the case where it
- references a namespace using prefix that is not in scope for this
- namespace. The output handler will take care of this problem. All namespace
- declarations are put in the output document using the output handler's
- <code>declarenamespace()</code> method. This method will monitor all namespace
- declarations and make sure that no unnecessary declarations are output.
- The datastructures used for this are similar to those used to track
- namespaces in the XSL stylesheet:</p>
-
- <anchor name="output_namespaces2"/>
- <p><img src="output_namespaces2.gif" alt="output_namespaces2.gif"/></p>
- <p><ref>Figure 9: Handling Namespace declarations in the output document</ref></p>
-
- </s2>
-</s1>
diff --git a/xdocs/sources/xsltc/xsltc_runtime.xml b/xdocs/sources/xsltc/xsltc_runtime.xml
deleted file mode 100644
index dd0ba43..0000000
--- a/xdocs/sources/xsltc/xsltc_runtime.xml
+++ /dev/null
@@ -1,415 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 2001 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 2001, Sun
- * Microsystems., http://www.sun.com. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
- <s1 title="XSLTC runtime environment">
- <ul>
- <li><link anchor="overview">Runtime overview</link></li>
- <li><link anchor="translet">The compiled translet</link></li>
- <li><link anchor="types">External/internal type mapping</link></li>
- <li><link anchor="mainloop">Main program loop</link></li>
-
- </ul>
- <anchor name="overview"/>
- <s2 title="Runtime overview">
- <p>The actual transformation of the input XML document is initiated by
- one of these classes:</p>
-
- <ul>
- <li>
- <code>com.sun.xslt.runtime.DefaultRun</code> (runs in a terminal)
- </li>
- <li>
- <code>com.sun.xslt.demo.applet.TransformApplet</code> (runs in an applet)
- </li>
- <li>
- <code>com.sun.xslt.demo.servlet.Translate</code> (runs in a servlet)
- </li>
- </ul>
-
- <p>Any one of these classes will have to go through the folloing steps in
- order to initiate a transformation:</p>
-
- <ul>
- <li>
- Instanciate the translet object. The name of the translet (ie. class)
- to use is passed to us as a string. We use this string as a parameter
- to the static method <code>Class.forName(String name)</code> to get a
- reference to a translet object.
- </li>
- <li>
- Instanciate a <code>com.sun.xsl.parser.Parser</code> object to parse the
- input XML file, and instanciate a DOM (we have our own DOM
- implementation especially designed for XSLTC) where we store the
- input document.
- </li>
- <li>
- Pass any parameters to the translet (currently only possible when
- running the transformation in a terminal using DefaultRun)
- </li>
- <li>
- Instanciate a handler for the result document. This handler must be
- extend the <code>TransletOutputHandler</code> class.
- </li>
- <li>
- Invoke the <code>transform()</code> method on the translet, passing the
- instanciated DOM and the output handler as parameters.
- </li>
- </ul>
-
- </s2><anchor name="translet"/>
- <s2 title="The compiled translet">
-
- <p>A translet is always a subclass of <code>AbstractTranslet</code>. As well
- as having access to the public/protected methods in this class, the
- translet is compiled with these methods:</p>
-
- <p><code>public void transform(DOM, NodeIterator, TransletOutputHandler);</code></p>
-
- <p>This method is passed a <code>DOMImpl</code> object. Depending on whether
- the stylesheet had any calls to the <code>document()</code> function this
- method will either generate a <code>DOMAdapter</code> object (when only one
- XML document is used as input) or a <code>MultiDOM</code> object (when there
- are more than one XML input documents). This DOM object is passed on to
- the <code>topLevel()</code> method.</p>
-
- <p>When the <code>topLevel()</code> method returns we initiate the output
- document by calling <code>startDocument()</code> on the supplied output
- handler object. We then call <code>applyTemplates()</code> to get the actual
- output contents, before we close the output document by calling
- <code>endDocument()</code> on the output handler.</p>
-
- <p><code>public void topLevel(DOM, NodeIterator, TransletOutputHandler);</code></p>
-
- <p>This method handles all of these top-level elements:</p>
- <ul>
- <li><code><xsl:output></code></li>
- <li><code><xsl:decimal-format></code></li>
- <li><code><xsl:key></code></li>
- <li><code><xsl:param></code> (for global parameters)</li>
- <li><code><xsl:variable></code> (for global variables)</li>
- </ul>
-
- <p><code>public void applyTemplates(DOM, NodeIterator, TransletOutputHandler);</code></p>
-
- <p>This is the method that produces the actual output. Its central element
- is a big <code>switch()</code> statement that is used to choose the available
- templates for the various node in the input document. See the chapter
- <link anchor="mainloop">Main Program Loop</link> for details on this method.</p>
-
- <p><code>public void <init> ();</code></p>
- <anchor name="namesarray"/>
- <p>The translet's constructor initializes a table
- of all the elements we want to search for in the XML input document.
- This table is called the <code>namesArray</code> and it is passed to the DOM
- holding the input XML document.</p>
-
- <p>The constructor also initializes any <code>DecimalFormatSymbol</code>
- objects that are used to format numbers before passing them to the
- output handler.</p>
-
- <p><code>public boolean stripSpace(int nodeType);</code></p>
-
- <p>This method is only present if any <code><xsl:strip-space></code> or
- <code><xsl:preserve-space></code> elements are present in the stylesheet.
- If that is the case, the translet implements the
- <code>StripWhitespaceFilter</code> interface by containing this method.</p>
-
- </s2><anchor name="types"/>
- <s2 title="External/internal type mapping">
-
- <anchor name="external-types"/>
-
- <p>This is the very core of XSL transformations: <em>Read carefully!!!</em></p>
-
- <p>Every node in the input XML document(s) is assigned a type by the
- DOM builder class. This type is an integer value which represents the
- element, so that for instance all <code><bob></code> elements in the
- input document will be given type <ref>7</ref> and can be referred to by using
- that integer. These types can be used for lookups in the
- <link anchor="namesarray">namesArray</link> table to get the actual
- element name (in this case "bob"). These types are referred to as
- <em>external types</em> or <em>DOM types</em>, as they are types known only
- to the DOM and the DOM builder.</p>
-
- <anchor name="internal-types"/>
-
- <p>Similarly the translet assignes types to all element and attribute names
- that are referenced in the stylesheet. These types are referred to as
- <em>internal types</em> or <em>translet types</em>.</p>
-
- <p>It is not very probable that there will be a one-to-one mapping between
- internal and external types. There will most often be elements in the DOM
- (ie. the input document) that are not mentioned in the stylesheet, and
- there could be elements in the stylesheet that do not match any elements
- in the DOM. Here is an example:</p>
-
-<source>
- <?xml version="1.0"?>
- <xsl:stylesheet version="1.0" xmlns:xsl="blahblahblah">
-
- <xsl:template match="/">
- <xsl:for-each select="//B">
- <xsl:apply-templates select="." />
- </xsl:for-each>
- <xsl:for-each select="C">
- <xsl:apply-templates select="." />
- </xsl:for-each>
- <xsl:for-each select="A/B">
- <xsl:apply-templates select="." />
- </xsl:for-each>
- </xsl:template>
-
- </xsl:stylesheet>
-</source>
-
- <p>In this stylesheet we are looking for elements <code><B></code>,
- <code><C></code> and <code><A></code>. For this example we can assume
- that these element types will be assigned the values 0, 1 and 2. Now, lets
- say we are transforming this XML document:</p>
-
-<source>
- <?xml version="1.0"?>
-
- <A>
- The crocodile cried:
- <F>foo</F>
- <B>bar</B>
- <B>baz</B>
- </A>
-</source>
-
- <p>This XML document has the elements <code><A></code>,
- <code><B></code> and <code><F></code>, which we assume are assigned the
- types 7, 8 and 9 respectively (the numbers below that are assigned for
- specific element types, such as the root node, text nodes, etc.). This
- causes a mismatch between the type used for <code><B></code> in the
- translet and the type used for <code><B></code> in the DOM. Th
- DOMAdapter class (which mediates between the DOM and the translet) has been
- given two tables for convertint between the two types; <code>mapping</code> for
- mapping from internal to external types, and <code>reverseMapping</code> for
- the other way around.</p>
-
- <p>The translet contains a <code>String[]</code> array called
- <code>namesArray</code>. This array will contain all the element and attribute
- names that were referenced in the stylesheet. In our example, this array
- would contain these string (in this specific order): "B",
- "C" and "A". This array is passed as one of the
- parameters to the DOM adapter constructor (the other adapter is the DOM
- itself). The DOM adapter passes this table on to the DOM. The DOM has
- a hashtable that maps known element names to external types. The DOM goes
- through the <code>namesArray</code> from the DOM sequentially, looks up each
- name in the hashtable, and is then able to map the internal type to an
- external type. The result is then passed back to the DOM adapter.</p>
-
- <p>The reverse is done for external types. External types that are not
- interesting for the translet (such as the type for <code><F></code>
- elements in the example above) are mapped to a generic <code>"ELEMENT"</code>
- type 3, and are more or less ignored by the translet.</p>
-
- <p>It is important that we separate the DOM from the translet. In several
- cases we want the DOM as a structure completely independent from the
- translet - even though the DOM is a structure internal to XSLTC. One such
- case is when transformations are offered by a servlet as a web service.
- Any DOM that is built should potentially be stored in a cache and made
- available for simultaneous access by several translet/servlet couples.</p>
-
- <p><img src="runtime_type_mapping.gif" alt="runtime_type_mapping.gif"/></p>
- <p><ref>Figure 1: Two translets accessing a single dom using different type mappings</ref></p>
-
- </s2><anchor name="mainloop"/>
- <s2 title="Main program loop">
-
- <p>The main loop in the translet is found in the <code>applyTemplates()</code>
- method. This method goes through these steps:</p>
-
- <ul>
- <li>
- Get the next node from the node iterator
- </li>
- <li>
- Get the internal type of this node. The DOMAdapter object holds the
- internal/external type mapping table, and it will supply the translet
- with the internal type of the current node.
- </li>
- <li>
- Execute a switch statement on the internal node type. There will be
- one "case" label for each recognised node type - this includes the
- first 7 internal node types.
- </li>
- </ul>
-
- <p>The root node will have internal type 0 and will cause any initial
- literal elements to be output. Text nodes will have internal node type 1
- and will simply be dumped to the output handler. Unrecognized elements
- will have internal node type 3 and will be given the default treatment
- (a new iterator is created for the node's children, and this iterator
- is passed with a recursive call to <code>applyTemplates()</code>).
- Unrecognised attribute nodes (type 4) will be handled like text nodes.
- The <code>switch()</code> statement in <code>applyTemplates</code> will thereby
- look something like this:</p>
-
-<source>
- public void applyTemplates(DOM dom, NodeIterator,
- TransletOutputHandler handler) {
-
- // get nodes from iterator
- while ((node = iterator.next()) != END) {
- // get internal node type
- switch(DOM.getType(node)) {
-
- case 0: // root
- outputPreable(handler);
- break;
- case 1: // text
- DOM.characters(node,handler);
- break;
- case 3: // unrecognised element
- NodeIterator newIterator = DOM.getChildren(node);
- applyTemplates(DOM,newIterator,handler);
- break;
- case 4: // unrecognised attribute
- DOM.characters(node,handler);
- break;
- case 7: // elements of type <B>
- someCompiledCode();
- break;
- case 8: // elements of type <C>
- otherCompiledCode();
- break;
- default:
- break;
- }
- }
- }
-</source>
-
- <p>Each recognised element will have its own piece of compiled code.</p>
-
- <p>Note that each "case" will not lead directly to a single template.
- There may be several templates that match node type 7
- (say <code><B></code>). In the sample stylesheet in the previous chapter
- we have to templates that would match a node <code><B></code>. We have
- one <code>match="//B"</code> (match just any <code><B></code> element) and
- one <code>match="A/B"</code> (match a <code><B></code> element that is a
- child of a <code><A></code> element). In this case we would have to
- compile code that first gets the type of the current node's parent, and
- then compared this type with the type for <code><A></code>. If there was
- no match we will have executed the first <code><xsl:for-each></code>
- element, but if there was a match we will have executed the last one.
- Consequentally, the compiler will generate the following code:</p>
-
-<source>
- switch(DOM.getType(node)) {
- :
- :
- case 7: // elements of type <B>
- int parent = DOM.getParent(node);
- if (DOM.getType(parent) == 9) // type 9 = elements <A>
- someCompiledCode();
- else
- evenOtherCompiledCode();
- break;
- :
- :
- }
-</source>
-
- <p>We could do the same for namespaces, that is, assign a numeric value
- to every namespace that is references in the stylesheet, and use an
- <code>"if"</code> statement for each namespace that needs to be checked for
- each type. Lets say we had a stylesheet like this:</p>
-
-<source>
- <?xml version="1.0"?>
- <xsl:stylesheet version="1.0" xmlns:xsl="blahblahblah">
-
- <xsl:template match="/"
- xmlns:foo="http://foo.com/spec"
- xmlns:bar="http://bar.net/ref">
- <xsl:for-each select="foo:A">
- <xsl:apply-templates select="." />
- </xsl:for-each>
- <xsl:for-each select="bar:A">
- <xsl:apply-templates select="." />
- </xsl:for-each>
- </xsl:template>
-
- </xsl:stylesheet>
-</source>
-
- <p>And a stylesheet like this:</p>
-
-<source>
- <?xml version="1.0"?>
-
- <DOC
- xmlns:foo="http://foo.com/spec"
- xmlns:bar="http://bar.net/ref">
- <foo:A>In foo namespace</foo:A>
- <bar:A>In bar namespace</bar:A>
- </DOC>
-</source>
-
- <p>We could still keep the same type for all <code><A></code> elements
- regardless of what namespace they are in, and use the same <code>"if"</code>
- structure within the <code>switch()</code> statement above. The other option
- is to assign different types to <code><foo:A></code> and
- <code><bar:A></code> elements.</p>
-
- </s2>
-</s1>
\ No newline at end of file
diff --git a/xdocs/sources/xsltc/xsltc_trax.xml b/xdocs/sources/xsltc/xsltc_trax.xml
deleted file mode 100644
index 99584b0..0000000
--- a/xdocs/sources/xsltc/xsltc_trax.xml
+++ /dev/null
@@ -1,691 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 2001 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 2001, Sun
- * Microsystems., http://www.sun.com. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-<s1 title="The Translet API & TrAX">
-<p><ref>By</ref> <jump href="mailto:todd.miller@east.sun.com">G. Todd Miller</jump> -updated May 11, 2001</p>
-<ul>
- <li><link anchor="abstract">Abstract</link></li>
- <li><link anchor="trax">TrAX</link></li>
- <li><link anchor="integrate">Translet Integration</link></li>
- <li><link anchor="factory">SAXTransformerFactory for Translets</link></li>
- <li><link anchor="transform">AbstractTranslet transform() method</link></li>
- <li><link anchor="conclusion">Conclusion</link></li>
- <li><link anchor="appendix">Appendix</link></li>
-</ul>
-<p>See also: <jump href="../xsltc_usage.html#api">Calling XSLTC with the TrAX/JAXP API</jump></p>
-<anchor name="abstract"/>
-<s2 title="Abstract">
-<p>This document describes what I have so far as a prototype for integrating
-Translets with the JAXP TrAX. In a nutshell, a new Transformer factory
-class has be written that extends the JAXP SAXTransformerFactory class.
-The newfactory delivers Translets as Transformers, and creates Templates.
-Calling the Transformer transform() method will cause the given XML
-document to be transformed by a translet that has been compiled from the
-supplied stylesheet. The switch that determines what XSLT processor gets
-to transform the XML document is based on the value of a JAXP system
-property for the Transformers factory.</p>
-</s2><anchor name="trax"/>
-<s2 title="TrAX">
-<p>The Java API for XML Processing (JAXP) includes an XSLT framework based on the
-Transformation API for XML (TrAX). In a typical JAXP transformation application
-the steps involved in transforming an XML document with an XSLT stylesheet are: (1)
-create an instance of the TransformerFactory class, (2) from the factory instance and
-a given XSLT stylesheet, create a new Transformer object, (3) call the Transformer
-objects transform() method on a given XML document and a specified Result object.
-Alternatively, one could also ask the instance of the TransformerFactory for
-a Templates object given an XSLT stylesheet. From the Templates object, a new
-Transformer can be created, and again, its transform() method can be called with
-an XML document and specified Result object.</p>
-<p>The code below illustrates a simple JAXP transformation application (Proto.java)
-that creates the Transformer directly.</p>
-<source>import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerFactory;
-
-public class Proto {
- public static void main(String[] args){
- Proto app = new Proto();
- app.run(args);
- }
-
- public void run(String[] args){
- if (args.length != 2) {
- usage();
- }
- String inputFilename = args[0];
- String stylesheet = args[1];
- Transformer transformer;
- TransformerFactory factory = TransformerFactory.newInstance();
- try {
- transformer = factory.newTransformer(new StreamSource(stylesheet));
- transformer.transform(new StreamSource(inputFilename),
- new StreamResult(System.out));
- } catch (Exception e) {
- // nothing...
- }
- }
-
- public void usage() {
- System.err.println(
- "Usage: run <xml_file> <xsl_file>");
- System.exit(1);
- }
-}</source>
-<p>The use of Templates is useful when multiple instances of the same transformer
-are needed. For example transforming multiple documents by the same transformer,
-each working in a separate thread. In this case, the TransformerFactory is used to
-create a Templates object for a given stylesheet. Each Transformer instance is then
-created by the Templates object. In this way the Templates object can compile the
-stylesheet once, and each time a new instance of the transformer is asked for, a clone is
-provided rather than recompile the stylesheet again and again. The Proto class above
-would be modified as follows:</p>
-<source>try {
- Templates templates = factory.newTemplates(new StreamSource(stylesheet));
- transformer = templates.newTransformer();
- transformer.transform(new StreamSource(inputFilename),
- new StreamResult(System.out));
-} catch (Exception e) {
- // nothing...
-}</source>
-<p>The JAXP TransformerFactory is configurable. The API supports configuring the
-factory to: (1) use attributes which are passed down to the underlying XSL processor,
-these are vendor dependent, (2) register an ErrorListener that provides callbacks
-to handle error and warning message generated by the XSL processor, (3) register
-an URIResolver which can be used to resolve URIs encountered in xsl:include,
-xsl:import,anddocument() functions.</p>
-<p>The JAXP TransformerFactory can be queried at runtme to discover what features
-it supports. For example, an application might want to know if a particular factory
-implementation supports the use of SAX events as a source, or whether it can write
-out transformation results as a DOM. The factory API queries with the getFeature()
-method. In the Proto code above, I could add the following code before the try-catch
-block:</p>
-<source>if (!(factory.getFeature(StreamSource.FEATURE)) ||
- !(factory.getFeature(StreamResult.FEATURE))) {
- System.err.println(
- "Stream Source/Result not supported by Transformer Factory\n" +
- "exiting.");
- System.exit(1);
-}</source>
-</s2><anchor name="integrate"/>
-<s2 title="Translet Integration">
-<p>The crux of the integration strategy is the pluggable TransformerFactory class. The
-JAXP specifies that the actual TransformerFactory implementation be controlled by the
-a Java system property (javax.xml.transformer.TransformerFactory) . This system property can be specified in the usual ways, for
-example in a properties file or on the command line as a -D optionpassed to thejava
-engine itself. The strategy involves writing a TransformerFactory for Translets.
-In the JAXP the TransformerFactory is an abstract class. In Xalan, the system
-property specifies the implementation class TransformerFactoryImpl (org.apache.xalan.processor.TransformerFactoryImpl).
- This implementation is an extension of the abstract SAXTransformerFactory class, which in
-turn is an extension of the abstract TransformerFactory class (javax.xml.transform.sax.SAXTransformerFactory).</p>
-<p>In this prototype integration I have constructed an XSLTC TransformerFactory as
-an extension of the abstract SAXTransformerFactory class.</p>
-
-</s2><anchor name="factory"/>
-<s2 title="SAXTransformerFactory for Translets">
-<p>The prototype XSLTC TransformerFactory needs to accomplish the following:</p>
- <ul>
- <li><link anchor="saxtransformerfactory">Implement the abstract methods of the SAXTransformerFactory class</link></li>
- <li><link anchor="transformerfactory">Implement the abstract methods of the TransformerFactory class</link></li></ul>
-<anchor name="saxtransformerfactory"/>
-<s3 title="SAXTransformerFactory Methods">
-
-<p>The methods of the abstract SAXTransformerFactory class have been stubbed out as
-follows.</p>
-<source>public TemplatesHandler newTemplatesHandler() { return null; }
-public TransformerHandler newTransformerHandler() { return null; }
-public TransformerHandler newTransformerHandler(Source src) {
-return null;
-}
-public TransformerHandler newTransformerHandler(Templates templates) {
-return null;
-}
-public XMLFilter newXMLFilter(Source src) { return null; }
-public XMLFilter newXMLFilter(Templates templates) { return null; }</source>
-<p>These stubbed out methods will need to be replaced with real implementations.</p>
-</s3><anchor name="transformerfactory"/>
-<s3 title="TransformerFactory Methods">
-<p>The methods of the abstract TransformerFactory class have been stubbed out as
-follows:</p>
-<source>public ErrorListener getErrorListener() { return null; }
-public void setErrorListener(ErrorListener listener) { }
-public Object getAttribute(String name) { return null; }
-public void setAttribute(String name, Object value) { }
-public boolean getFeature(String name) { return false; }
-public URIResolver getURIResolver() { return null; }
-public void setURIResolver(URIResolver resolver) { }
-public Source getAssociatedStylesheet(Source src, String media,
-String title, String charset) { return null; }
-public Templates newTemplates(Source xslSrc) throws
-TransformerConfigurationException { return null; }
-public Transformer newTransformer() throws
-TransformerConfigurationException { return null; }</source>
-<p>The methods listed above fall into 4 categories: (1) <link anchor="transformcreation">Transform creation</link>,
-(2) <link anchor="templatescreation">Templates creation</link>, (3) <link anchor="featurediscovery">feature discovery</link>,
-and (4) <link anchor="limitations">others that will remain unimplemented at this time</link>.</p>
-<anchor name="transformercreation"/>
-<s4 title="Transformer Creation">
-<p>The JAXP specifies a method that takes the stylesheet as a Source object and returns a
-Transformer.</p>
-<p><code>public Transformer newTransformer(Source xslSrc)</code></p>
-<p>This method needs to return a Transformer to comply with the JAXP API, but also
-needs to return a Translet. In the XSLTC/Xalan API, a Translet is an interface that is
-implemented by the runtime abstract class AbstractTranslet (org.apache.xalan.xsltc.Translet and org.apache.xalan.xsltc.runtime.AbstractTranslet, repectively). Therefore, I had to
-change the AbstractTranslet class so that it will extend the abstract Transformer
-class while still implementing the Translet interface. Once this is done, then the
-newTransformer() method of the new TransformerFactory can return a Translet that
-is a Transformer.</p>
-<p>In order to have AbstractTranslet extend Transformer, several abstract methods
-have to be implemented in AbstractTranslet class. These are:</p>
-<source>public void clearParameters() { }
-public ErrorListener getErrorListener() { return null; }
-public Properties getOutputProperties() throws IllegalArgumentException {
- return null;
-}
-public String getOutputProperty(String name)
- throws IllegalArgumentException{ return ""; }
-//public Object getParameter(String name) { return null; }
-public URIResolver getURIResolver() { return null; }
-public void setErrorListener(ErrorListener listener)
- throws IllegalArgumentException { }
-public void setOutputProperties(Properties props)
- throws IllegalArgumentException { }
-public void setOutputProperty(String name, String value)
- throws IllegalArgumentException { }
-public void setParameter(String name, Object value) { }
-public void setURIResolver(URIResolver resolver) { }
-public void transform(Source xmlsrc, Result outputTarget)
- throws TransformerException { ... }</source>
-<p>Mapping these methods to some existing ones in AbstractTranslet still has to be
-done. In particular the transform() method which is explained further in a following
-section.</p>
-<p>Now that XSLTCs AbstractTranslet is a Transformer, the new Transformer
-factory class can implement the newTransformer() method. This method needs to do
-two fundamental things: (1) create a translet from the given XSLT stylesheet and (2)
-instantiate the translet so it can be returned as a Transformer.</p>
-<p>The code belows hows my current implementation of the newTransformer() method
-in the new factory class:</p>
-<source>public class ToddsTransformerFactoryImpl extends SAXTransformerFactory {
- ...
- public Transformer newTransformer(Source stylesheet) throws
- TransformerConfigurationException
- {
- XSLTC xsltc = new XSLTC();
- xsltc.init();
- String stylesheetName = stylesheet.getSystemId();
- int index = stylesheetName.indexOf(.);
- String transletName = stylesheetName.substring(0,index);
- boolean isSuccessful = true;
- try {
- File file = new File(stylesheetName);
- URL url = file.toURL();
- isSuccessful = xsltc.compile(url);
- } catch (MalformedURLException e) {
- throw new TransformerConfigurationException(
- "URL for stylesheet " + stylesheetName +
- " can not be formed.");
- }
-
- if (!isSuccessful) {
- throw new TransformerConfigurationException(
- "Compilation of stylesheet " + stylesheetName + " failed.");
- }
-
- Translet translet = null;
- try {
- Class clazz = Class.forName(transletName);
- translet = (Translet)clazz.newInstance();
- ((AbstractTranslet)translet).setTransletName(transletName);
- } catch (ClassNotFoundException e) {
- throw new TransformerConfigurationException(
- "Translet class " + transletName + " not found.");
- } catch (InstantiationException e) {
- throw new TransformerConfigurationException(
- "Translet class " + transletName +
- " could not be instantiated");
- } catch (IllegalAccessException e) {
- throw new TransformerConfigurationException(
- "Translet class " + transletName + " could not be accessed.");
- }
- return (AbstractTranslet)translet;
- }
-}</source>
-</s4><anchor name="templatescreation"/>
-<s4 title="Templates Creation">
-<p>The JAXP specifies a method that takes the stylesheet as a Source object and returns a
-Templates object.</p>
-<p><code>public Templates newTemplates(Source xslSrc)</code></p>
-<p>To implement this method I needed to create a new class that would be a Templates
-for Translets object. The new class TransletTemplates (org.apache.xalan.xsltc.runtime.TransletTemplates) implements the Templates
-interface as is shown below:</p>
-<source>package org.apache.xalan.xsltc.runtime;
-
-import javax.xml.transform.Templates;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import org.apache.xalan.xsltc.runtime.AbstractTranslet;
-import java.util.Properties;
-
-public class TransletTemplates implements Templates {
- public TransletTemplates(Transformer translet) {
- _translet = (AbstractTranslet)translet;
- }
-
- public Properties getOutputProperties() { /*TBD*/ return null; }
-
- public Transformer newTransformer() throws
- TransformerConfigurationException
- {
- if (_translet == null) {
- throw new TransformerConfigurationException(
- "Error: Null Translet");
- }
- return _translet;
- }
- private AbstractTranslet _translet = null;
-}</source>
-<p>The factory method newTemplates() simply creates a Transformer for the stylesheet,
-and returns a newTransletTemplates object. The implementation of newTemplates()
-is shown below:</p>
-<source>public class TransformerFactoryImpl extends SAXTransformerFactory {
-...
- public Templates newTemplates(Source stylesheet) throws
- TransformerConfigurationException
- {
- Transformer translet = newTransformer(stylesheet);
- return new TransletTemplates(translet);
- }
-}</source>
-<p>This implementation only satisfies the JAXP, it does not address caching of previously
-created translets. This type of mechanism belongs in Templates,where a given
-stylesheet will be compiled one time only, but the generated translet can be cloned to
-create multiple instances upon demand.</p>
-</s4><anchor name="featurediscovery"/>
-<s4 title="Feature Discovery">
-<p>The JAXP specifies a method that allows programs to discover what features the factory
-is capable of supporting.</p>
-<p><code>public boolean getFeature(String featureName)</code></p>
-<p>At this time the new transformer factory supports Stream sources and results, and
-the SAX Transform factory feature. The getFeature() implementation is shown below:</p>
-<source>public class TransformerFactoryImpl extends SAXTransformerFactory {
- ...
- public boolean getFeature(String name) {
- if ((StreamSource.FEATURE == name) ||
- (StreamResult.FEATURE == name) ||
- (SAXTransformerFactory.FEATURE == name)) {
- return true;
- } else if ((StreamSource.FEATURE.equals(name))
- || (StreamResult.FEATURE.equals(name))
- || (SAXTransformerFactory.FEATURE.equals(name))) {
- return true;
- } else {
- return false;
- }
- }
-}</source>
-<p>As the other features are implemented, this methods will need to be updated.</p>
-
-</s4><anchor name="limitations"/>
-<s4 title="Limitations">
-<p>As you can see, the prototype will compile the stylesheet everytime. This obviously
-needs to be smarter. This is where the question do I already have this translet? needs
-to be answered. Also for now the translet bytecodes are written out to a File in the current
-working directory, and then instantiated using a Class.forName, newInstance()
-pair. This also needs work. Note the return statement, the Translet is cast to an AbstractTranslet
-which now is a Transformer.</p>
-</s4>
-</s3>
-</s2><anchor name="transform"/>
-<s2 title="AbstractTranslets transform() Method">
-<p>Now the JAXP program (Proto) shown in the first section has a way to get a Transformer
-factory that can return Translets. The next step of the Proto.java program is
-calling the transform() method and having the Translet process the given XML
-document.</p>
-<p>This requires some surgery in the AbstractTranslet class again. The AbstractTranslet
-already has a transform() method, but its signature is not the same as the
-JAXP Transform signature. In the AbstractTranslet, transform methods expect a DOM
-argument, in some cases a NodeIterator, and a TransletOutputHandler argument. The
-JAXP Transforms transform() signature requires only the XML document as a Source
-object reference and an outputTarget as a Result object reference. My implementation
-of the JAXP transform() signature is as shown:</p>
-
-<source>public void transform(Source xmlsrc, Result outputTarget)
- throws TransformerException
-{
- doTransform( xmlsrc.getSystemId(),
- ((StreamResult)outputTarget).getOutputStream() );
-}</source>
-<p>This implementation leverages code derived from XSLTCs DefaultRun class. In
-that class there is a doTransform() method that carries out the work of: (1) parsing the
-input XML document (using a JAXP SAXParserFactory and SAXParser), (2) creating
-a DOMImpl (org.apache.xalan.xsltc.dom.DOMImpl), (3) creating a SAXOutputHandler, and finally (4) calling the translet to
-transform the input XML document (from the DOMImpl).</p>
-<p>The code for doTransform is shown below:</p>
-<source>public abstract class AbstractTranslet extends Transformer implements Translet{
- ...
- private void doTransform(String xmlDocName, OutputStream ostream) {
- try {
- final Translet translet = (Translet)this; // GTM added
-
- // Create a SAX parser and get the XMLReader object it uses
- final SAXParserFactory factory = SAXParserFactory.newInstance();
- final SAXParser parser = factory.newSAXParser();
- final XMLReader reader = parser.getXMLReader();
-
- // Set the DOMs DOM builder as the XMLReaders SAX2 content handler
- final DOMImpl dom = new DOMImpl();
- reader.setContentHandler(dom.getBuilder());
- // Create a DTD monitor and pass it to the XMLReader object
- final DTDMonitor dtdMonitor = new DTDMonitor();
- dtdMonitor.handleDTD(reader);
- dom.setDocumentURI(xmlDocName);
- /****************
- if (_uri)
- reader.parse(xmlDocName);
- else
- *******************/
- reader.parse("file:"+(new File(xmlDocName).getAbsolutePath()));
-
- // Set size of key/id indices
- setIndexSize(dom.getSize());
- // If there are any elements with ID attributes, build an index
- dtdMonitor.buildIdIndex(dom, 0, this);
-
- setUnparsedEntityURIs(dtdMonitor.getUnparsedEntityURIs());
-
- // Transform the document
- String encoding = translet.getOutputEncoding();
- if (encoding == null) encoding = "UTF-8";
-
- //TextOutput textOutput = new TextOutput(System.out, encoding);
- DefaultSAXOutputHandler saxHandler = new
- DefaultSAXOutputHandler(ostream, encoding);
- TextOutput textOutput = new TextOutput(saxHandler, encoding);
- translet.transform(dom, textOutput);
- textOutput.flush();
- }
- catch (TransletException e) {
- ...
- }
- catch (RuntimeException e) {
- ...
- }
- catch (FileNotFoundException e) {
- ...
- }
- catch (MalformedURLException e) {
- ...
- }
- catch (UnknownHostException e) {
- ...
- }
- catch (Exception e) {
- ...
- }
- }
-}</source>
-</s2><anchor name="conclusion"/>
-<s2 title="Conclusion">
-<p>This is the current state of the integration of Translet and TrAX. The JAXP program
-illustrated in the first section (Proto.java) compiles and runs with the changes outlined
-above. The new transformer factory TransformerFactoryImpl supports transformer,
-templates creation, and the feature discovery mechanism. The transformers
-returned from the factory are in fact AbstractTranslet objects. The new class
-TransletTemplates implements the Templates interface for translets. This is the
-result of a first pass implementation, there are many stubbed out methods that need to
-be implemented, translet caching in Templates needs to be implemented and support
-for Source and Result types beyond simple stream types, such as DOM and SAX.</p>
-
-</s2><anchor name="appendix"/>
-<s2 title="Appendix">
-<ul>
- <li><link anchor="runscript">The Run script</link></li>
- <li><link anchor="transformerfactoryimpl">TransformerFactoryImpl.java</link></li>
- <li><link anchor="TransletTemplates">TransletTemplates.java</link></li>
- <li><link anchor="makefile">The Makefile</link></li>
-</ul>
-<anchor name="runscript"/>
-<s3 title="The Run script">
-<p>By changing the FAC variable I can switch between the two Transformer factory implementations
-for testing.</p>
-<source>#!/bin/ksh
-JAXP=/usr/local/jaxp-1.1/jaxp.jar
-CRIMSON=/usr/local/jaxp-1.1/crimson.jar
-XSLT=/net/bigblock/files18/tmiller/xml-xalan/java/build/classes
-XML=/net/bigblock/files18/tmiller/xml-xalan/java/bin/xml.jar
-BCEL=/net/bigblock/files18/tmiller/xml-xalan/java/bin/BCEL.jar
-JCUP=/net/bigblock/files18/tmiller/xml-xalan/java/bin/java_cup.jar
-JCUPRT=/net/bigblock/files18/tmiller/xml-xalan/java/bin/runtime.jar
-CLASSPATH=${JAXP}:${CRIMSON}:${XSLT}:${XML}:${BCEL}:${JCUP}:${JCUPRT}:.
-FAC=org.apache.xalan.xsltc.runtime.TransformerFactoryImpl
-#FAC=org.apache.xalan.processor.TransformerFactoryImpl
-java -classpath ${CLASSPATH} \
- -Djavax.xml.transform.TransformerFactory=${FAC} \
- Proto $@</source>
-</s3><anchor name="transformerfactoryimpl"/>
-<s3 title="TransformerFactoryImpl.java">
-
-<source>package org.apache.xalan.xsltc.runtime;
-
-import javax.xml.transform.Templates;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.ErrorListener;
-import javax.xml.transform.Source;
-import javax.xml.transform.stream.StreamSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.URIResolver;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TemplatesHandler;
-import javax.xml.transform.sax.TransformerHandler;
-
-import org.xml.sax.XMLFilter;
-
-import org.apache.xalan.xsltc.Translet;
-import org.apache.xalan.xsltc.compiler.XSLTC;
-import org.apache.xalan.xsltc.runtime.AbstractTranslet;
-
-import java.io.File;
-import java.net.URL;
-import java.net.MalformedURLException;
-
-/**
- * Implementation of a JAXP1.1 SAXTransformerFactory for Translets.
- */
-public class TransformerFactoryImpl extends SAXTransformerFactory {
- public TransformerFactoryImpl() { /* nothing yet */ }
-
- //////////////////////////////////////////////////////
- // SAXTransformerFactory (subclass of TransformerFactory)
- //
- public TemplatesHandler newTemplatesHandler() { /*TBD*/ return null; }
- public TransformerHandler newTransformerHandler() { /*TBD*/ return null; }
- public TransformerHandler newTransformerHandler(Source src) {
- /*TBD*/ return null;
- }
- public TransformerHandler newTransformerHandler(Templates templates) {
- /*TBD*/ return null;
- }
- public XMLFilter newXMLFilter(Source src) { /*TBD*/ return null; }
- public XMLFilter newXMLFilter(Templates templates) { /*TBD*/ return null; }
-
- //
- // End SAXTransformerFactory methods
- //////////////////////////////////////////////////////
- //////////////////////////////////////////////////////
- // TransformerFactory
- //
- public ErrorListener getErrorListener() { /*TBD*/ return null; }
- public void setErrorListener(ErrorListener listener) {/*TBD*/ }
- public Object getAttribute(String name) { /*TBD*/ return null; }
- public void setAttribute(String name, Object value) { /*TBD*/ }
- public boolean getFeature(String name) {
- if ((StreamSource.FEATURE == name) ||
- (StreamResult.FEATURE == name) ||
- (SAXTransformerFactory.FEATURE == name)) {
- return true;
- } else if ((StreamSource.FEATURE.equals(name))
- || (StreamResult.FEATURE.equals(name))
- || (SAXTransformerFactory.FEATURE.equals(name))) {
- return true;
- } else {
- return false;
- }
- }
- public URIResolver getURIResolver() { /*TBD*/ return null; }
- public void setURIResolver(URIResolver resolver) {/*TBD*/ }
- public Source getAssociatedStylesheet(Source src, String media,
- String title, String charset) { /*TBD*/ return null; }
- public Transformer newTransformer() throws
- TransformerConfigurationException { /*TBD*/ return null; }
- //
- // End TransformerFactory methods
- //////////////////////////////////////////////////////
- public Transformer newTransformer(Source stylesheet) throws
- TransformerConfigurationException
- {
- XSLTC xsltc = new XSLTC();
- xsltc.init();
- String stylesheetName = stylesheet.getSystemId();
- int index = stylesheetName.indexOf(.);
- String transletName = stylesheetName.substring(0,index);
- boolean isSuccessful = true;
- try {
- File file = new File(stylesheetName);
- URL url = file.toURL();
- isSuccessful = xsltc.compile(url);
- } catch (MalformedURLException e) {
- throw new TransformerConfigurationException(
- "URL for stylesheet " + stylesheetName +
- " can not be formed.");
- }
- if (!isSuccessful) {
- throw new TransformerConfigurationException(
- "Compilation of stylesheet " + stylesheetName + " failed.");
- }
-
- Translet translet = null;
- try {
- Class clazz = Class.forName(transletName);
- translet = (Translet)clazz.newInstance();
- ((AbstractTranslet)translet).setTransletName(transletName);
- } catch (ClassNotFoundException e) {
- throw new TransformerConfigurationException(
- "Translet class " + transletName + " not found.");
- } catch (InstantiationException e) {
- throw new TransformerConfigurationException(
- "Translet class " + transletName +
- " could not be instantiated");
- } catch (IllegalAccessException e) {
- throw new TransformerConfigurationException(
- "Translet class " + transletName + " could not be accessed.");
- }
- return (AbstractTranslet)translet;
- }
- public Templates newTemplates(Source stylesheet) throws
- TransformerConfigurationException
- {
- Transformer translet = newTransformer(stylesheet);
- return new TransletTemplates(translet);
- }
-}</source>
-</s3><anchor name="translettemplates"/>
-<s3 title="TransletTemplates.java">
-<source>package org.apache.xalan.xsltc.runtime;
-
-import javax.xml.transform.Templates;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.sax.SAXTransformerFactory;
-
-import org.apache.xalan.xsltc.runtime.AbstractTranslet;
-import java.util.Properties;
-
-/**
- * Implementation of a JAXP1.1 Templates object for Translets.
- */
-public class TransletTemplates implements Templates {
- public TransletTemplates(Transformer translet) {
- _translet = (AbstractTranslet)translet;
- }
- public Properties getOutputProperties() { /*TBD*/ return null; }
- public Transformer newTransformer() throws
- TransformerConfigurationException
- {
- if (_translet == null) {
- throw new TransformerConfigurationException(
- "Error: Null Translet");
- }
- return _translet;
- }
- private AbstractTranslet _translet = null;
-}</source>
-</s3><anchor name="makefile"/>
-<s3 title="The Makefile">
-<source>JAXP=/usr/local/jaxp-1.1/jaxp.jar
-CRIMSON=/usr/local/jaxp-1.1/crimson.jar
-XSLT=/net/bigblock/files18/tmiller/xml-xalan/java/build/classes
-CLASSPATH=${JAXP}:${CRIMSON}:${XSLT}
-SRCS=\
-Proto.java
-all:
-javac -classpath ${CLASSPATH} ${SRCS}</source>
-</s3>
-</s2>
-</s1>
\ No newline at end of file
diff --git a/xdocs/sources/xsltc/xsltover.xml b/xdocs/sources/xsltc/xsltover.xml
deleted file mode 100644
index 155782c..0000000
--- a/xdocs/sources/xsltc/xsltover.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" standalone="no"?>
-<!DOCTYPE s1 SYSTEM "../../style/dtd/document.dtd">
-
-<!--
- * The Apache Software License, Version 1.1
- *
- *
- * Copyright (c) 1999 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution,
- * if any, must include the following acknowledgment:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowledgment may appear in the software itself,
- * if and wherever such third-party acknowledgments normally appear.
- *
- * 4. The names "Xalan" and "Apache Software Foundation" must
- * not be used to endorse or promote products derived from this
- * software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache",
- * nor may "Apache" appear in their name, without prior written
- * permission of the Apache Software Foundation.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation and was
- * originally based on software copyright (c) 1999, Lotus
- * Development Corporation., http://www.lotus.com. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- -->
-
-
-<s1 title="XSLT Compiler and Runtime">
-
- <s2 title="Using the Command-Line Utility">
-
- </s2>
-</s1>