blob: c5f5ab2bec732260f681e00b77186dc144f86f5c [file] [log] [blame]
/*
* 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/>.
*/
package org.apache.xalan.templates;
// Java imports
import java.io.ObjectInputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.text.DecimalFormatSymbols;
import java.util.Hashtable;
import java.util.Stack;
import java.util.Vector;
// Xalan imports
import org.apache.xml.utils.SystemIDResolver;
import org.apache.xml.utils.QName;
import org.apache.xml.utils.StringVector;
import org.apache.xpath.XPath;
// DOM Imports
//import org.w3c.dom.Node;
//import org.w3c.dom.Document;
import org.apache.xml.dtm.DTM;
// SAX2 Imports
import javax.xml.transform.TransformerException;
import org.xml.sax.Locator;
import javax.xml.transform.SourceLocator;
/**
* Represents a stylesheet element.
* <p>All properties in this class have a fixed form of bean-style property
* accessors for all properties that represent XSL attributes or elements.
* These properties have setter method names accessed generically by the
* processor, and so these names must be fixed according to the system
* defined in the <a href="XSLTAttributeDef#getSetterMethodName">getSetterMethodName</a>
* function.</p>
* <p><pre>
* <!ENTITY % top-level "
* (xsl:import*,
* (xsl:include
* | xsl:strip-space
* | xsl:preserve-space
* | xsl:output
* | xsl:key
* | xsl:decimal-format
* | xsl:attribute-set
* | xsl:variable
* | xsl:param
* | xsl:template
* | xsl:namespace-alias
* %non-xsl-top-level;)*)
* ">
*
* <!ENTITY % top-level-atts '
* extension-element-prefixes CDATA #IMPLIED
* exclude-result-prefixes CDATA #IMPLIED
* id ID #IMPLIED
* version NMTOKEN #REQUIRED
* xmlns:xsl CDATA #FIXED "http://www.w3.org/1999/XSL/Transform"
* %space-att;
* '>
*
* <!ELEMENT xsl:stylesheet %top-level;>
* <!ATTLIST xsl:stylesheet %top-level-atts;>
*
* <!ELEMENT xsl:transform %top-level;>
* <!ATTLIST xsl:transform %top-level-atts;>
*
* </p></pre>
* @see <a href="http://www.w3.org/TR/xslt#section-Stylesheet-Structure">section-Stylesheet-Structure in XSLT Specification</a>
*/
public class Stylesheet extends ElemTemplateElement
implements java.io.Serializable /* , Document */
{
/**
* Constructor for a Stylesheet.
* @param parent The including or importing stylesheet.
*/
public Stylesheet(Stylesheet parent)
{
if (null != parent)
{
m_stylesheetParent = parent;
m_stylesheetRoot = parent.getStylesheetRoot();
}
}
/**
* Get the owning stylesheet. This looks up the
* inheritance chain until it calls getStylesheet
* on a Stylesheet object, which will return itself.
*
* @return The owning stylesheet, itself.
*/
public Stylesheet getStylesheet()
{
return this;
}
/**
* Tell if this can be cast to a StylesheetComposed, meaning, you
* can ask questions from getXXXComposed functions.
*
* @return False if this is not a StylesheetComposed
*/
public boolean isAggregatedType()
{
return false;
}
/**
* Tell if this is the root of the stylesheet tree.
*
* @return False is this is not the root of the stylesheet tree.
*/
public boolean isRoot()
{
return false;
}
/**
* Extension to be used when serializing to disk.
*/
public static final String STYLESHEET_EXT = ".lxc";
/**
* Read the stylesheet from a serialization stream.
*
* @param stream Input stream to read from
*
* @throws IOException
* @throws TransformerException
*/
private void readObject(ObjectInputStream stream)
throws IOException, TransformerException
{
// System.out.println("Reading Stylesheet");
try
{
stream.defaultReadObject();
}
catch (ClassNotFoundException cnfe)
{
throw new TransformerException(cnfe);
}
// System.out.println("Done reading Stylesheet");
}
/**
* Write out the given output stream
*
*
* @param stream The output stream to write out
*
* @throws IOException
*/
private void writeObject(ObjectOutputStream stream) throws IOException
{
// System.out.println("Writing Stylesheet");
stream.defaultWriteObject();
// System.out.println("Done writing Stylesheet");
}
//============== XSLT Properties =================
/**
* The "xmlns:xsl" property.
* @serial
*/
private String m_XmlnsXsl;
/**
* Set the "xmlns:xsl" property.
* @see <a href="http://www.w3.org/TR/xslt#xslt-namespace">xslt-namespace in XSLT Specification</a>
*
* @param v The value to be set for the "xmlns:xsl" property.
*/
public void setXmlnsXsl(String v)
{
m_XmlnsXsl = v;
}
/**
* Get the "xmlns:xsl" property.
* @see <a href="http://www.w3.org/TR/xslt#xslt-namespace">xslt-namespace in XSLT Specification</a>
*
* @return The value of the "xmlns:xsl" property.
*/
public String getXmlnsXsl()
{
return m_XmlnsXsl;
}
/**
* The "extension-element-prefixes" property, actually contains URIs.
* @serial
*/
private StringVector m_ExtensionElementURIs;
/**
* Set the "extension-element-prefixes" property.
* @see <a href="http://www.w3.org/TR/xslt#extension-element">extension-element in XSLT Specification</a>
*
* @param v The value to be set for the "extension-element-prefixes"
* property: a vector of extension element URIs.
*/
public void setExtensionElementPrefixes(StringVector v)
{
m_ExtensionElementURIs = v;
}
/**
* Get and "extension-element-prefix" property.
* @see <a href="http://www.w3.org/TR/xslt#extension-element">extension-element in XSLT Specification</a>
*
* @param i Index of extension element URI in list
*
* @return The extension element URI at the given index
*
* @throws ArrayIndexOutOfBoundsException
*/
public String getExtensionElementPrefix(int i)
throws ArrayIndexOutOfBoundsException
{
if (null == m_ExtensionElementURIs)
throw new ArrayIndexOutOfBoundsException();
return m_ExtensionElementURIs.elementAt(i);
}
/**
* Get the number of "extension-element-prefixes" Strings.
* @see <a href="http://www.w3.org/TR/xslt#extension-element">extension-element in XSLT Specification</a>
*
* @return Number of URIs in the list
*/
public int getExtensionElementPrefixCount()
{
return (null != m_ExtensionElementURIs)
? m_ExtensionElementURIs.size() : 0;
}
/**
* Find out if this contains a given "extension-element-prefix" property.
* @see <a href="http://www.w3.org/TR/xslt#extension-element">extension-element in XSLT Specification</a>
*
* @param uri URI of extension element to look for
*
* @return True if the given URI was found in the list
*/
public boolean containsExtensionElementURI(String uri)
{
if (null == m_ExtensionElementURIs)
return false;
return m_ExtensionElementURIs.contains(uri);
}
/**
* The "exclude-result-prefixes" property.
* @serial
*/
private StringVector m_ExcludeResultPrefixs;
/**
* Set the "exclude-result-prefixes" property.
* The designation of a namespace as an excluded namespace is
* effective within the subtree of the stylesheet rooted at
* the element bearing the exclude-result-prefixes or
* xsl:exclude-result-prefixes attribute; a subtree rooted
* at an xsl:stylesheet element does not include any stylesheets
* imported or included by children of that xsl:stylesheet element.
* @see <a href="http://www.w3.org/TR/xslt#literal-result-element">literal-result-element in XSLT Specification</a>
*
* @param v A StringVector of prefixes to exclude
*/
public void setExcludeResultPrefixes(StringVector v)
{
m_ExcludeResultPrefixs = v;
}
/**
* Get an "exclude-result-prefix" property.
* The designation of a namespace as an excluded namespace is
* effective within the subtree of the stylesheet rooted at
* the element bearing the exclude-result-prefixes or
* xsl:exclude-result-prefixes attribute; a subtree rooted
* at an xsl:stylesheet element does not include any stylesheets
* imported or included by children of that xsl:stylesheet element.
* @see <a href="http://www.w3.org/TR/xslt#literal-result-element">literal-result-element in XSLT Specification</a>
*
* @param i Index of prefix to get in list
*
* @return Prefix to be excluded at the given index
*
* @throws ArrayIndexOutOfBoundsException
*/
public String getExcludeResultPrefix(int i)
throws ArrayIndexOutOfBoundsException
{
if (null == m_ExcludeResultPrefixs)
throw new ArrayIndexOutOfBoundsException();
return m_ExcludeResultPrefixs.elementAt(i);
}
/**
* Get the number of "exclude-result-prefixes" Strings.
* @see <a href="http://www.w3.org/TR/xslt#literal-result-element">literal-result-element in XSLT Specification</a>
*
* @return The number of prefix strings to be excluded.
*/
public int getExcludeResultPrefixCount()
{
return (null != m_ExcludeResultPrefixs)
? m_ExcludeResultPrefixs.size() : 0;
}
/**
* Get whether or not the passed prefix is contained flagged by
* the "exclude-result-prefixes" property.
* @see <a href="http://www.w3.org/TR/xslt#literal-result-element">literal-result-element in XSLT Specification</a>
*
* @param prefix non-null reference to prefix that might be excluded.
* @param uri reference to namespace that prefix maps to
*
* @return true if the prefix should normally be excluded.>
*/
public boolean containsExcludeResultPrefix(String prefix, String uri)
{
if (null == m_ExcludeResultPrefixs || uri == null )
return false;
// This loop is ok here because this code only runs during
// stylesheet compile time.
for (int i =0; i< m_ExcludeResultPrefixs.size(); i++)
{
if (uri.equals(getNamespaceForPrefix(m_ExcludeResultPrefixs.elementAt(i))))
return true;
}
return false;
/* if (prefix.length() == 0)
prefix = Constants.ATTRVAL_DEFAULT_PREFIX;
return m_ExcludeResultPrefixs.contains(prefix); */
}
/**
* The "id" property.
* @serial
*/
private String m_Id;
/**
* Set the "id" property.
* @see <a href="http://www.w3.org/TR/xslt#section-Embedding-Stylesheets">section-Embedding-Stylesheets in XSLT Specification</a>
*
* @param v Value for the "id" property.
*/
public void setId(String v)
{
m_Id = v;
}
/**
* Get the "id" property.
* @see <a href="http://www.w3.org/TR/xslt#section-Embedding-Stylesheets">section-Embedding-Stylesheets in XSLT Specification</a>
*
* @return The value of the "id" property.
*/
public String getId()
{
return m_Id;
}
/**
* The "version" property.
* @serial
*/
private String m_Version;
/**
* Set the "version" property.
* @see <a href="http://www.w3.org/TR/xslt#forwards">forwards in XSLT Specification</a>
*
* @param v Value for the "version" property.
*/
public void setVersion(String v)
{
m_Version = v;
}
/**
* Get the "version" property.
* @see <a href="http://www.w3.org/TR/xslt#forwards">forwards in XSLT Specification</a>
*
* @return The value of the "version" property.
*/
public String getVersion()
{
return m_Version;
}
/**
* The "xsl:import" list.
* @serial
*/
private Vector m_imports;
/**
* Add a stylesheet to the "import" list.
* @see <a href="http://www.w3.org/TR/xslt#import">import in XSLT Specification</a>
*
* @param v Stylesheet to add to the import list
*/
public void setImport(StylesheetComposed v)
{
if (null == m_imports)
m_imports = new Vector();
// I'm going to insert the elements in backwards order,
// so I can walk them 0 to n.
m_imports.addElement(v);
}
/**
* Get a stylesheet from the "import" list.
* @see <a href="http://www.w3.org/TR/xslt#import">import in XSLT Specification</a>
*
* @param i Index of the stylesheet to get
*
* @return The stylesheet at the given index
*
* @throws ArrayIndexOutOfBoundsException
*/
public StylesheetComposed getImport(int i)
throws ArrayIndexOutOfBoundsException
{
if (null == m_imports)
throw new ArrayIndexOutOfBoundsException();
return (StylesheetComposed) m_imports.elementAt(i);
}
/**
* Get the number of imported stylesheets.
* @see <a href="http://www.w3.org/TR/xslt#import">import in XSLT Specification</a>
*
* @return the number of imported stylesheets.
*/
public int getImportCount()
{
return (null != m_imports) ? m_imports.size() : 0;
}
/**
* The "xsl:include" properties.
* @serial
*/
private Vector m_includes;
/**
* Add a stylesheet to the "include" list.
* @see <a href="http://www.w3.org/TR/xslt#include">include in XSLT Specification</a>
*
* @param v Stylesheet to add to the "include" list
*/
public void setInclude(Stylesheet v)
{
if (null == m_includes)
m_includes = new Vector();
m_includes.addElement(v);
}
/**
* Get the stylesheet at the given in index in "include" list
* @see <a href="http://www.w3.org/TR/xslt#include">include in XSLT Specification</a>
*
* @param i Index of stylesheet to get
*
* @return Stylesheet at the given index
*
* @throws ArrayIndexOutOfBoundsException
*/
public Stylesheet getInclude(int i) throws ArrayIndexOutOfBoundsException
{
if (null == m_includes)
throw new ArrayIndexOutOfBoundsException();
return (Stylesheet) m_includes.elementAt(i);
}
/**
* Get the number of included stylesheets.
* @see <a href="http://www.w3.org/TR/xslt#import">import in XSLT Specification</a>
*
* @return the number of included stylesheets.
*/
public int getIncludeCount()
{
return (null != m_includes) ? m_includes.size() : 0;
}
/**
* Table of tables of element decimal-format.
* @see DecimalFormatProperties
* @serial
*/
Stack m_DecimalFormatDeclarations;
/**
* Process the xsl:decimal-format element.
*
* @param edf Decimal-format element to push into stack
*/
public void setDecimalFormat(DecimalFormatProperties edf)
{
if (null == m_DecimalFormatDeclarations)
m_DecimalFormatDeclarations = new Stack();
// Elements are pushed in by order of importance
// so that when recomposed, they get overiden properly.
m_DecimalFormatDeclarations.push(edf);
}
/**
* Get an "xsl:decimal-format" property.
*
* @see DecimalFormatProperties
* @see <a href="http://www.w3.org/TR/xslt#format-number">format-number in XSLT Specification</a>
*
* @param name The qualified name of the decimal format property.
* @return null if not found, otherwise a DecimalFormatProperties
* object, from which you can get a DecimalFormatSymbols object.
*/
public DecimalFormatProperties getDecimalFormat(QName name)
{
if (null == m_DecimalFormatDeclarations)
return null;
int n = getDecimalFormatCount();
for (int i = (n - 1); i >= 0; i++)
{
DecimalFormatProperties dfp = getDecimalFormat(i);
if (dfp.getName().equals(name))
return dfp;
}
return null;
}
/**
* Get an "xsl:decimal-format" property.
* @see <a href="http://www.w3.org/TR/xslt#format-number">format-number in XSLT Specification</a>
* @see DecimalFormatProperties
*
* @param i Index of decimal-format property in stack
*
* @return The decimal-format property at the given index
*
* @throws ArrayIndexOutOfBoundsException
*/
public DecimalFormatProperties getDecimalFormat(int i)
throws ArrayIndexOutOfBoundsException
{
if (null == m_DecimalFormatDeclarations)
throw new ArrayIndexOutOfBoundsException();
return (DecimalFormatProperties) m_DecimalFormatDeclarations.elementAt(i);
}
/**
* Get the number of xsl:decimal-format declarations.
* @see DecimalFormatProperties
*
* @return the number of xsl:decimal-format declarations.
*/
public int getDecimalFormatCount()
{
return (null != m_DecimalFormatDeclarations)
? m_DecimalFormatDeclarations.size() : 0;
}
/**
* The "xsl:strip-space" properties,
* A lookup table of all space stripping elements.
* @serial
*/
private Vector m_whitespaceStrippingElements;
/**
* Set the "xsl:strip-space" properties.
* @see <a href="http://www.w3.org/TR/xslt#strip">strip in XSLT Specification</a>
*
* @param wsi WhiteSpaceInfo element to add to list
*/
public void setStripSpaces(WhiteSpaceInfo wsi)
{
if (null == m_whitespaceStrippingElements)
{
m_whitespaceStrippingElements = new Vector();
}
m_whitespaceStrippingElements.addElement(wsi);
}
/**
* Get an "xsl:strip-space" property.
* @see <a href="http://www.w3.org/TR/xslt#strip">strip in XSLT Specification</a>
*
* @param i Index of WhiteSpaceInfo to get
*
* @return WhiteSpaceInfo at given index
*
* @throws ArrayIndexOutOfBoundsException
*/
public WhiteSpaceInfo getStripSpace(int i) throws ArrayIndexOutOfBoundsException
{
if (null == m_whitespaceStrippingElements)
throw new ArrayIndexOutOfBoundsException();
return (WhiteSpaceInfo) m_whitespaceStrippingElements.elementAt(i);
}
/**
* Get the number of "xsl:strip-space" properties.
* @see <a href="http://www.w3.org/TR/xslt#strip">strip in XSLT Specification</a>
*
* @return the number of "xsl:strip-space" properties.
*/
public int getStripSpaceCount()
{
return (null != m_whitespaceStrippingElements)
? m_whitespaceStrippingElements.size() : 0;
}
/**
* The "xsl:preserve-space" property,
* A lookup table of all space preserving elements.
* @serial
*/
private Vector m_whitespacePreservingElements;
/**
* Set the "xsl:preserve-space" property.
* @see <a href="http://www.w3.org/TR/xslt#strip">strip in XSLT Specification</a>
*
* @param wsi WhiteSpaceInfo element to add to list
*/
public void setPreserveSpaces(WhiteSpaceInfo wsi)
{
if (null == m_whitespacePreservingElements)
{
m_whitespacePreservingElements = new Vector();
}
m_whitespacePreservingElements.addElement(wsi);
}
/**
* Get a "xsl:preserve-space" property.
* @see <a href="http://www.w3.org/TR/xslt#strip">strip in XSLT Specification</a>
*
* @param i Index of WhiteSpaceInfo to get
*
* @return WhiteSpaceInfo at the given index
*
* @throws ArrayIndexOutOfBoundsException
*/
public WhiteSpaceInfo getPreserveSpace(int i) throws ArrayIndexOutOfBoundsException
{
if (null == m_whitespacePreservingElements)
throw new ArrayIndexOutOfBoundsException();
return (WhiteSpaceInfo) m_whitespacePreservingElements.elementAt(i);
}
/**
* Get the number of "xsl:preserve-space" properties.
* @see <a href="http://www.w3.org/TR/xslt#strip">strip in XSLT Specification</a>
*
* @return the number of "xsl:preserve-space" properties.
*/
public int getPreserveSpaceCount()
{
return (null != m_whitespacePreservingElements)
? m_whitespacePreservingElements.size() : 0;
}
/**
* The "xsl:output" properties. This is a vector of OutputProperties objects.
* @serial
*/
private Vector m_output;
/**
* Set the "xsl:output" property.
* @see <a href="http://www.w3.org/TR/xslt#output">output in XSLT Specification</a>
*
* @param v non-null reference to the OutputProperties object to be
* added to the collection.
*/
public void setOutput(OutputProperties v)
{
if (null == m_output)
{
m_output = new Vector();
}
m_output.addElement(v);
}
/**
* Get an "xsl:output" property.
* @see <a href="http://www.w3.org/TR/xslt#output">output in XSLT Specification</a>
*
* @param i Index of OutputFormatExtended to get
*
* @return non-null reference to an OutputProperties object.
*
* @throws ArrayIndexOutOfBoundsException
*/
public OutputProperties getOutput(int i) throws ArrayIndexOutOfBoundsException
{
if (null == m_output)
throw new ArrayIndexOutOfBoundsException();
return (OutputProperties) m_output.elementAt(i);
}
/**
* Get the number of "xsl:output" properties.
* @see <a href="http://www.w3.org/TR/xslt#output">output in XSLT Specification</a>
*
* @return The number of OutputProperties objects contained in this stylesheet.
*/
public int getOutputCount()
{
return (null != m_output)
? m_output.size() : 0;
}
/**
* The "xsl:key" property.
* @serial
*/
private Vector m_keyDeclarations;
/**
* Set the "xsl:key" property.
* @see <a href="http://www.w3.org/TR/xslt#key">key in XSLT Specification</a>
*
* @param v KeyDeclaration element to add to the list of key declarations
*/
public void setKey(KeyDeclaration v)
{
if (null == m_keyDeclarations)
m_keyDeclarations = new Vector();
m_keyDeclarations.addElement(v);
}
/**
* Get an "xsl:key" property.
* @see <a href="http://www.w3.org/TR/xslt#key">key in XSLT Specification</a>
*
* @param i Index of KeyDeclaration element to get
*
* @return KeyDeclaration element at given index in list
*
* @throws ArrayIndexOutOfBoundsException
*/
public KeyDeclaration getKey(int i) throws ArrayIndexOutOfBoundsException
{
if (null == m_keyDeclarations)
throw new ArrayIndexOutOfBoundsException();
return (KeyDeclaration) m_keyDeclarations.elementAt(i);
}
/**
* Get the number of "xsl:key" properties.
* @see <a href="http://www.w3.org/TR/xslt#key">key in XSLT Specification</a>
*
* @return the number of "xsl:key" properties.
*/
public int getKeyCount()
{
return (null != m_keyDeclarations) ? m_keyDeclarations.size() : 0;
}
/**
* The "xsl:attribute-set" property.
* @serial
*/
private Vector m_attributeSets;
/**
* Set the "xsl:attribute-set" property.
* @see <a href="http://www.w3.org/TR/xslt#attribute-sets">attribute-sets in XSLT Specification</a>
*
* @param attrSet ElemAttributeSet to add to the list of attribute sets
*/
public void setAttributeSet(ElemAttributeSet attrSet)
{
if (null == m_attributeSets)
{
m_attributeSets = new Vector();
}
m_attributeSets.addElement(attrSet);
}
/**
* Get an "xsl:attribute-set" property.
* @see <a href="http://www.w3.org/TR/xslt#attribute-sets">attribute-sets in XSLT Specification</a>
*
* @param i Index of ElemAttributeSet to get in list
*
* @return ElemAttributeSet at the given index
*
* @throws ArrayIndexOutOfBoundsException
*/
public ElemAttributeSet getAttributeSet(int i)
throws ArrayIndexOutOfBoundsException
{
if (null == m_attributeSets)
throw new ArrayIndexOutOfBoundsException();
return (ElemAttributeSet) m_attributeSets.elementAt(i);
}
/**
* Get the number of "xsl:attribute-set" properties.
* @see <a href="http://www.w3.org/TR/xslt#attribute-sets">attribute-sets in XSLT Specification</a>
*
* @return the number of "xsl:attribute-set" properties.
*/
public int getAttributeSetCount()
{
return (null != m_attributeSets) ? m_attributeSets.size() : 0;
}
/**
* The "xsl:variable" and "xsl:param" properties.
* @serial
*/
private Vector m_topLevelVariables;
/**
* Set the "xsl:variable" property.
* @see <a href="http://www.w3.org/TR/xslt#top-level-variables">top-level-variables in XSLT Specification</a>
*
* @param v ElemVariable object to add to list of top level variables
*/
public void setVariable(ElemVariable v)
{
if (null == m_topLevelVariables)
m_topLevelVariables = new Vector();
m_topLevelVariables.addElement(v);
}
/**
* Get an "xsl:variable" or "xsl:param" property.
* @see <a href="http://www.w3.org/TR/xslt#top-level-variables">top-level-variables in XSLT Specification</a>
*
* @param qname non-null reference to the qualified name of the variable.
*
* @return The ElemVariable with the given name in the list or null
*/
public ElemVariable getVariableOrParam(QName qname)
{
if (null != m_topLevelVariables)
{
int n = getVariableOrParamCount();
for (int i = 0; i < n; i++)
{
ElemVariable var = (ElemVariable) getVariableOrParam(i);
if (var.getName().equals(qname))
return var;
}
}
return null;
}
/**
* Get an "xsl:variable" property.
* @see <a href="http://www.w3.org/TR/xslt#top-level-variables">top-level-variables in XSLT Specification</a>
*
* @param qname Qualified name of the xsl:variable to get
*
* @return reference to the variable named by qname, or null if not found.
*/
public ElemVariable getVariable(QName qname)
{
if (null != m_topLevelVariables)
{
int n = getVariableOrParamCount();
for (int i = 0; i < n; i++)
{
ElemVariable var = getVariableOrParam(i);
if((var.getXSLToken() == Constants.ELEMNAME_VARIABLE) &&
(var.getName().equals(qname)))
return var;
}
}
return null;
}
/**
* Get an "xsl:variable" property.
* @see <a href="http://www.w3.org/TR/xslt#top-level-variables">top-level-variables in XSLT Specification</a>
*
* @param i Index of variable to get in the list
*
* @return ElemVariable at the given index in the list
*
* @throws ArrayIndexOutOfBoundsException
*/
public ElemVariable getVariableOrParam(int i) throws ArrayIndexOutOfBoundsException
{
if (null == m_topLevelVariables)
throw new ArrayIndexOutOfBoundsException();
return (ElemVariable) m_topLevelVariables.elementAt(i);
}
/**
* Get the number of "xsl:variable" properties.
* @see <a href="http://www.w3.org/TR/xslt#top-level-variables">top-level-variables in XSLT Specification</a>
*
* @return the number of "xsl:variable" properties.
*/
public int getVariableOrParamCount()
{
return (null != m_topLevelVariables) ? m_topLevelVariables.size() : 0;
}
/**
* Set an "xsl:param" property.
* @see <a href="http://www.w3.org/TR/xslt#top-level-variables">top-level-variables in XSLT Specification</a>
*
* @param v A non-null ElemParam reference.
*/
public void setParam(ElemParam v)
{
setVariable(v);
}
/**
* Get an "xsl:param" property.
* @see <a href="http://www.w3.org/TR/xslt#top-level-variables">top-level-variables in XSLT Specification</a>
*
* @param qname non-null reference to qualified name of the parameter.
*
* @return ElemParam with the given name in the list or null
*/
public ElemParam getParam(QName qname)
{
if (null != m_topLevelVariables)
{
int n = getVariableOrParamCount();
for (int i = 0; i < n; i++)
{
ElemVariable var = getVariableOrParam(i);
if((var.getXSLToken() == Constants.ELEMNAME_PARAMVARIABLE) &&
(var.getName().equals(qname)))
return (ElemParam)var;
}
}
return null;
}
/**
* The "xsl:template" properties.
* @serial
*/
private Vector m_templates;
/**
* Set an "xsl:template" property.
* @see <a href="http://www.w3.org/TR/xslt#section-Defining-Template-Rules">section-Defining-Template-Rules in XSLT Specification</a>
*
* @param v ElemTemplate to add to list of templates
*/
public void setTemplate(ElemTemplate v)
{
if (null == m_templates)
m_templates = new Vector();
m_templates.addElement(v);
v.setStylesheet(this);
}
/**
* Get an "xsl:template" property.
* @see <a href="http://www.w3.org/TR/xslt#section-Defining-Template-Rules">section-Defining-Template-Rules in XSLT Specification</a>
*
* @param i Index of ElemTemplate in the list to get
*
* @return ElemTemplate at the given index in the list
*
* @throws TransformerException
*/
public ElemTemplate getTemplate(int i) throws TransformerException
{
if (null == m_templates)
throw new ArrayIndexOutOfBoundsException();
return (ElemTemplate) m_templates.elementAt(i);
}
/**
* Get the number of "xsl:template" properties.
* @see <a href="http://www.w3.org/TR/xslt#section-Defining-Template-Rules">section-Defining-Template-Rules in XSLT Specification</a>
*
* @return the number of "xsl:template" properties.
*/
public int getTemplateCount()
{
return (null != m_templates) ? m_templates.size() : 0;
}
/**
* The "xsl:namespace-alias" properties.
* @serial
*/
private Vector m_prefix_aliases;
/**
* Set the "xsl:namespace-alias" property.
* @see <a href="http://www.w3.org/TR/xslt#literal-result-element">literal-result-element in XSLT Specification</a>
*
* @param na NamespaceAlias elemeent to add to the list
*/
public void setNamespaceAlias(NamespaceAlias na)
{
if (m_prefix_aliases == null)
m_prefix_aliases = new Vector();
m_prefix_aliases.addElement(na);
}
/**
* Get an "xsl:namespace-alias" property.
* @see <a href="http://www.w3.org/TR/xslt#literal-result-element">literal-result-element in XSLT Specification</a>
*
* @param i Index of NamespaceAlias element to get from the list
*
* @return NamespaceAlias element at the given index in the list
*
* @throws ArrayIndexOutOfBoundsException
*/
public NamespaceAlias getNamespaceAlias(int i)
throws ArrayIndexOutOfBoundsException
{
if (null == m_prefix_aliases)
throw new ArrayIndexOutOfBoundsException();
return (NamespaceAlias) m_prefix_aliases.elementAt(i);
}
/**
* Get the number of "xsl:namespace-alias" properties.
* @see <a href="http://www.w3.org/TR/xslt#top-level-variables">top-level-variables in XSLT Specification</a>
*
* @return the number of "xsl:namespace-alias" properties.
*/
public int getNamespaceAliasCount()
{
return (null != m_prefix_aliases) ? m_prefix_aliases.size() : 0;
}
/**
* The "non-xsl-top-level" properties.
* @serial
*/
private Hashtable m_NonXslTopLevel;
/**
* Set found a non-xslt element.
* @see <a href="http://www.w3.org/TR/xslt#stylesheet-element">stylesheet-element in XSLT Specification</a>
*
* @param name Qualified name of the element
* @param obj The element object
*/
public void setNonXslTopLevel(QName name, Object obj)
{
if (null == m_NonXslTopLevel)
m_NonXslTopLevel = new Hashtable();
m_NonXslTopLevel.put(name, obj);
}
/**
* Get a non-xslt element.
* @see <a href="http://www.w3.org/TR/xslt#stylesheet-element">stylesheet-element in XSLT Specification</a>
*
* @param name Qualified name of the element to get
*
* @return The object associate with the given name
*/
public Object getNonXslTopLevel(QName name)
{
return (null != m_NonXslTopLevel) ? m_NonXslTopLevel.get(name) : null;
}
// =========== End top-level XSLT properties ===========
/**
* The base URL of the XSL document.
* @serial
*/
private String m_href = null;
/** The doctype-public element.
* @serial */
private String m_publicId;
/** The doctype-system element.
* @serial */
private String m_systemId;
/**
* Get the base identifier with which this stylesheet is associated.
*
* @return the base identifier with which this stylesheet is associated.
*/
public String getHref()
{
return m_href;
}
/**
* Set the base identifier with which this stylesheet is associated.
*
* @param baseIdent the base identifier with which this stylesheet is associated.
*/
public void setHref(String baseIdent)
{
m_href = baseIdent;
}
/**
* Set the location information for this element.
*
* @param locator SourceLocator object with location information
*/
public void setLocaterInfo(SourceLocator locator)
{
if (null != locator)
{
m_publicId = locator.getPublicId();
m_systemId = locator.getSystemId();
if (null != m_systemId)
{
try
{
m_href = SystemIDResolver.getAbsoluteURI(m_systemId, null);
}
catch (TransformerException se)
{
// Ignore this for right now
}
}
super.setLocaterInfo(locator);
}
}
/**
* The root of the stylesheet, where all the tables common
* to all stylesheets are kept.
* @serial
*/
private StylesheetRoot m_stylesheetRoot;
/**
* Get the root of the stylesheet, where all the tables common
* to all stylesheets are kept.
*
* @return the root of the stylesheet
*/
public StylesheetRoot getStylesheetRoot()
{
return m_stylesheetRoot;
}
/**
* Set the root of the stylesheet, where all the tables common
* to all stylesheets are kept.
*
* @param v the root of the stylesheet
*/
public void setStylesheetRoot(StylesheetRoot v)
{
m_stylesheetRoot = v;
}
/**
* The parent of the stylesheet. This will be null if this
* is the root stylesheet.
* @serial
*/
private Stylesheet m_stylesheetParent;
/**
* Get the parent of the stylesheet. This will be null if this
* is the root stylesheet.
*
* @return the parent of the stylesheet.
*/
public Stylesheet getStylesheetParent()
{
return m_stylesheetParent;
}
/**
* Set the parent of the stylesheet. This should be null if this
* is the root stylesheet.
*
* @param v the parent of the stylesheet.
*/
public void setStylesheetParent(Stylesheet v)
{
m_stylesheetParent = v;
}
/**
* Get the owning aggregated stylesheet, or this
* stylesheet if it is aggregated.
*
* @return the owning aggregated stylesheet or itself
*/
public StylesheetComposed getStylesheetComposed()
{
Stylesheet sheet = this;
while (!sheet.isAggregatedType())
{
sheet = sheet.getStylesheetParent();
}
return (StylesheetComposed) sheet;
}
/**
* Get the type of the node. We'll pretend we're a Document.
*
* @return the type of the node: document node.
*/
public short getNodeType()
{
return DTM.DOCUMENT_NODE;
}
/**
* Get an integer representation of the element type.
*
* @return An integer representation of the element, defined in the
* Constants class.
* @see org.apache.xalan.templates.Constants
*/
public int getXSLToken()
{
return Constants.ELEMNAME_STYLESHEET;
}
/**
* Return the node name.
*
* @return The node name
*/
public String getNodeName()
{
return Constants.ELEMNAME_STYLESHEET_STRING;
}
/**
* Replace an "xsl:template" property.
* This is a hook for CompilingStylesheetHandler, to allow
* us to access a template, compile it, instantiate it,
* and replace the original with the compiled instance.
* ADDED 9/5/2000 to support compilation experiment
*
* @param v Compiled template to replace with
* @param i Index of template to be replaced
*
* @throws TransformerException
*/
public void replaceTemplate(ElemTemplate v, int i) throws TransformerException
{
if (null == m_templates)
throw new ArrayIndexOutOfBoundsException();
replaceChild(v, (ElemTemplateElement)m_templates.elementAt(i));
m_templates.setElementAt(v, i);
v.setStylesheet(this);
}
/**
* Call the children visitors.
* @param visitor The visitor whose appropriate method will be called.
*/
protected void callChildVisitors(XSLTVisitor visitor, boolean callAttrs)
{
int s = getImportCount();
for (int j = 0; j < s; j++)
{
getImport(j).callVisitors(visitor);
}
s = getIncludeCount();
for (int j = 0; j < s; j++)
{
getInclude(j).callVisitors(visitor);
}
s = getOutputCount();
for (int j = 0; j < s; j++)
{
visitor.visitTopLevelInstruction(getOutput(j));
}
// Next, add in the attribute-set elements
s = getAttributeSetCount();
for (int j = 0; j < s; j++)
{
ElemAttributeSet attrSet = getAttributeSet(j);
if (visitor.visitTopLevelInstruction(attrSet))
{
attrSet.callChildVisitors(visitor);
}
}
// Now the decimal-formats
s = getDecimalFormatCount();
for (int j = 0; j < s; j++)
{
visitor.visitTopLevelInstruction(getDecimalFormat(j));
}
// Now the keys
s = getKeyCount();
for (int j = 0; j < s; j++)
{
visitor.visitTopLevelInstruction(getKey(j));
}
// And the namespace aliases
s = getNamespaceAliasCount();
for (int j = 0; j < s; j++)
{
visitor.visitTopLevelInstruction(getNamespaceAlias(j));
}
// Next comes the templates
s = getTemplateCount();
for (int j = 0; j < s; j++)
{
try
{
ElemTemplate template = getTemplate(j);
if (visitor.visitTopLevelInstruction(template))
{
template.callChildVisitors(visitor);
}
}
catch (TransformerException te)
{
throw new org.apache.xml.utils.WrappedRuntimeException(te);
}
}
// Then, the variables
s = getVariableOrParamCount();
for (int j = 0; j < s; j++)
{
ElemVariable var = getVariableOrParam(j);
if (visitor.visitTopLevelVariableOrParamDecl(var))
{
var.callChildVisitors(visitor);
}
}
// And lastly the whitespace preserving and stripping elements
s = getStripSpaceCount();
for (int j = 0; j < s; j++)
{
visitor.visitTopLevelInstruction(getStripSpace(j));
}
s = getPreserveSpaceCount();
for (int j = 0; j < s; j++)
{
visitor.visitTopLevelInstruction(getPreserveSpace(j));
}
if(null != m_NonXslTopLevel)
{
java.util.Enumeration enum = m_NonXslTopLevel.elements();
while(enum.hasMoreElements())
{
ElemTemplateElement elem = (ElemTemplateElement)enum.nextElement();
if (visitor.visitTopLevelInstruction(elem))
{
elem.callChildVisitors(visitor);
}
}
}
}
/**
* Accept a visitor and call the appropriate method
* for this class.
*
* @param visitor The visitor whose appropriate method will be called.
* @return true if the children of the object should be visited.
*/
protected boolean accept(XSLTVisitor visitor)
{
return visitor.visitStylesheet(this);
}
}