org.apache.xalan.templates.Stylesheet Maven / Gradle / Ivy
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* $Id: Stylesheet.java 468643 2006-10-28 06:56:03Z minchau $
*/
package org.apache.xalan.templates;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Hashtable;
import java.util.Stack;
import java.util.Vector;
import javax.xml.transform.SourceLocator;
import javax.xml.transform.TransformerException;
import org.apache.xml.dtm.DTM;
import org.apache.xml.utils.QName;
import org.apache.xml.utils.StringVector;
import org.apache.xml.utils.SystemIDResolver;
/**
* Represents a stylesheet element.
* 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 getSetterMethodName
* function.
*
*
*
*
*
*
*
*
*
*
*
*
* @see section-Stylesheet-Structure in XSLT Specification
*/
public class Stylesheet extends ElemTemplateElement
implements java.io.Serializable /* , Document */
{
static final long serialVersionUID = 2085337282743043776L;
/**
* 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 xslt-namespace in XSLT Specification
*
* @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 xslt-namespace in XSLT Specification
*
* @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 extension-element in XSLT Specification
*
* @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 extension-element in XSLT Specification
*
* @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 extension-element in XSLT Specification
*
* @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 extension-element in XSLT Specification
*
* @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 literal-result-element in XSLT Specification
*
* @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 literal-result-element in XSLT Specification
*
* @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 literal-result-element in XSLT Specification
*
* @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 literal-result-element in XSLT Specification
*
* @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 section-Embedding-Stylesheets in XSLT Specification
*
* @param v Value for the "id" property.
*/
public void setId(String v)
{
m_Id = v;
}
/**
* Get the "id" property.
* @see section-Embedding-Stylesheets in XSLT Specification
*
* @return The value of the "id" property.
*/
public String getId()
{
return m_Id;
}
/**
* The "version" property.
* @serial
*/
private String m_Version;
/**
* Whether or not the stylesheet is in "Forward Compatibility Mode"
* @serial
*/
private boolean m_isCompatibleMode = false;
/**
* Set the "version" property.
* @see forwards in XSLT Specification
*
* @param v Value for the "version" property.
*/
public void setVersion(String v)
{
m_Version = v;
m_isCompatibleMode = (Double.valueOf(v).doubleValue() > Constants.XSLTVERSUPPORTED);
}
/**
* Get whether or not the stylesheet is in "Forward Compatibility Mode"
*
* @return true if in forward compatible mode, false otherwise
*/
public boolean getCompatibleMode()
{
return m_isCompatibleMode;
}
/**
* Get the "version" property.
* @see forwards in XSLT Specification
*
* @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 import in XSLT Specification
*
* @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 import in XSLT Specification
*
* @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 import in XSLT Specification
*
* @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 include in XSLT Specification
*
* @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 include in XSLT Specification
*
* @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 import in XSLT Specification
*
* @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 format-number in XSLT Specification
*
* @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 format-number in XSLT Specification
* @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 strip in XSLT Specification
*
* @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 strip in XSLT Specification
*
* @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 strip in XSLT Specification
*
* @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 strip in XSLT Specification
*
* @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 strip in XSLT Specification
*
* @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 strip in XSLT Specification
*
* @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 output in XSLT Specification
*
* @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 output in XSLT Specification
*
* @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 output in XSLT Specification
*
* @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 key in XSLT Specification
*
* @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 key in XSLT Specification
*
* @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 key in XSLT Specification
*
* @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 attribute-sets in XSLT Specification
*
* @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 attribute-sets in XSLT Specification
*
* @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 attribute-sets in XSLT Specification
*
* @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 top-level-variables in XSLT Specification
*
* @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 top-level-variables in XSLT Specification
*
* @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 top-level-variables in XSLT Specification
*
* @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 top-level-variables in XSLT Specification
*
* @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 top-level-variables in XSLT Specification
*
* @return the number of "xsl:variable" properties.
*/
public int getVariableOrParamCount()
{
return (null != m_topLevelVariables) ? m_topLevelVariables.size() : 0;
}
/**
* Set an "xsl:param" property.
* @see top-level-variables in XSLT Specification
*
* @param v A non-null ElemParam reference.
*/
public void setParam(ElemParam v)
{
setVariable(v);
}
/**
* Get an "xsl:param" property.
* @see top-level-variables in XSLT Specification
*
* @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 section-Defining-Template-Rules in XSLT Specification
*
* @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 section-Defining-Template-Rules in XSLT Specification
*
* @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 section-Defining-Template-Rules in XSLT Specification
*
* @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 literal-result-element in XSLT Specification
*
* @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 literal-result-element in XSLT Specification
*
* @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 top-level-variables in XSLT Specification
*
* @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 stylesheet-element in XSLT Specification
*
* @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 stylesheet-element in XSLT Specification
*
* @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 elements = m_NonXslTopLevel.elements();
while(elements.hasMoreElements())
{
ElemTemplateElement elem = (ElemTemplateElement)elements.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);
}
}