/* * 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.processor; import java.util.Hashtable; import org.apache.xalan.templates.*; import org.apache.xml.utils.QName; /** * This class defines the allowed structure for a stylesheet, and the * mapping between Xalan classes and the markup elements in the stylesheet. * @see <a href="http://www.w3.org/TR/xslt#dtd">XSLT DTD</a> */ public class XSLTSchema extends XSLTElementDef { /** * Construct a XSLTSchema which represents the XSLT "schema". */ XSLTSchema() { build(); } /** * This method builds an XSLT "schema" according to http://www.w3.org/TR/xslt#dtd. This * schema provides instructions for building the Xalan Stylesheet (Templates) structure. */ void build() { XSLTAttributeDef hrefAttr = new XSLTAttributeDef(null, "href", XSLTAttributeDef.T_URL, true); XSLTAttributeDef elementsAttr = new XSLTAttributeDef(null, "elements", XSLTAttributeDef.T_SIMPLEPATTERNLIST, true); // XSLTAttributeDef anyNamespacedAttr = new XSLTAttributeDef("*", "*", // XSLTAttributeDef.T_CDATA, false); XSLTAttributeDef methodAttr = new XSLTAttributeDef(null, "method", XSLTAttributeDef.T_QNAME, false); XSLTAttributeDef versionAttr = new XSLTAttributeDef(null, "version", XSLTAttributeDef.T_NMTOKEN, false); XSLTAttributeDef encodingAttr = new XSLTAttributeDef(null, "encoding", XSLTAttributeDef.T_CDATA, false); XSLTAttributeDef omitXmlDeclarationAttr = new XSLTAttributeDef(null, "omit-xml-declaration", XSLTAttributeDef.T_YESNO, false); XSLTAttributeDef standaloneAttr = new XSLTAttributeDef(null, "standalone", XSLTAttributeDef.T_YESNO, false); XSLTAttributeDef doctypePublicAttr = new XSLTAttributeDef(null, "doctype-public", XSLTAttributeDef.T_CDATA, false); XSLTAttributeDef doctypeSystemAttr = new XSLTAttributeDef(null, "doctype-system", XSLTAttributeDef.T_CDATA, false); XSLTAttributeDef cdataSectionElementsAttr = new XSLTAttributeDef(null, "cdata-section-elements", XSLTAttributeDef.T_QNAMES, false); XSLTAttributeDef indentAttr = new XSLTAttributeDef(null, "indent", XSLTAttributeDef.T_YESNO, false); XSLTAttributeDef mediaTypeAttr = new XSLTAttributeDef(null, "media-type", XSLTAttributeDef.T_CDATA, false); XSLTAttributeDef nameAttrRequired = new XSLTAttributeDef(null, "name", XSLTAttributeDef.T_QNAME, true); XSLTAttributeDef nameAttrOpt = new XSLTAttributeDef(null, "name", XSLTAttributeDef.T_QNAME, false); XSLTAttributeDef useAttr = new XSLTAttributeDef(null, "use", XSLTAttributeDef.T_EXPR, true); XSLTAttributeDef nameAVTRequired = new XSLTAttributeDef(null, "name", XSLTAttributeDef.T_AVT, true); XSLTAttributeDef namespaceAVTOpt = new XSLTAttributeDef(null, "namespace", XSLTAttributeDef.T_AVT, false); XSLTAttributeDef decimalSeparatorAttr = new XSLTAttributeDef(null, "decimal-separator", XSLTAttributeDef.T_CHAR, "."); XSLTAttributeDef groupingSeparatorAttr = new XSLTAttributeDef(null, "grouping-separator", XSLTAttributeDef.T_CHAR, ","); XSLTAttributeDef infinityAttr = new XSLTAttributeDef(null, "infinity", XSLTAttributeDef.T_CDATA, "Infinity"); XSLTAttributeDef minusSignAttr = new XSLTAttributeDef(null, "minus-sign", XSLTAttributeDef.T_CHAR, "-"); XSLTAttributeDef NaNAttr = new XSLTAttributeDef(null, "NaN", XSLTAttributeDef.T_CDATA, "NaN"); XSLTAttributeDef percentAttr = new XSLTAttributeDef(null, "percent", XSLTAttributeDef.T_CHAR, "%"); XSLTAttributeDef perMilleAttr = new XSLTAttributeDef(null, "per-mille", XSLTAttributeDef.T_CHAR, false /* ,"‰" */); XSLTAttributeDef zeroDigitAttr = new XSLTAttributeDef(null, "zero-digit", XSLTAttributeDef.T_CHAR, "0"); XSLTAttributeDef digitAttr = new XSLTAttributeDef(null, "digit", XSLTAttributeDef.T_CHAR, "#"); XSLTAttributeDef patternSeparatorAttr = new XSLTAttributeDef(null, "pattern-separator", XSLTAttributeDef.T_CHAR, ";"); XSLTAttributeDef useAttributeSetsAttr = new XSLTAttributeDef(null, "use-attribute-sets", XSLTAttributeDef.T_QNAMES, false); XSLTAttributeDef selectAttrRequired = new XSLTAttributeDef(null, "select", XSLTAttributeDef.T_EXPR, true); XSLTAttributeDef testAttrRequired = new XSLTAttributeDef(null, "test", XSLTAttributeDef.T_EXPR, true); XSLTAttributeDef selectAttrOpt = new XSLTAttributeDef(null, "select", XSLTAttributeDef.T_EXPR, false); XSLTAttributeDef selectAttrDefNode = new XSLTAttributeDef(null, "select", XSLTAttributeDef.T_EXPR, "node()"); XSLTAttributeDef selectAttrDefDot = new XSLTAttributeDef(null, "select", XSLTAttributeDef.T_EXPR, "."); XSLTAttributeDef matchAttrRequired = new XSLTAttributeDef(null, "match", XSLTAttributeDef.T_PATTERN, true); XSLTAttributeDef matchAttrOpt = new XSLTAttributeDef(null, "match", XSLTAttributeDef.T_PATTERN, false); XSLTAttributeDef priorityAttr = new XSLTAttributeDef(null, "priority", XSLTAttributeDef.T_PRIORITY, false); XSLTAttributeDef modeAttr = new XSLTAttributeDef(null, "mode", XSLTAttributeDef.T_QNAME, false); XSLTAttributeDef spaceAttr = new XSLTAttributeDef(Constants.S_XMLNAMESPACEURI, "space", false, "default", Constants.ATTRVAL_STRIP, "preserve", Constants.ATTRVAL_PRESERVE); XSLTAttributeDef spaceAttrLiteral = new XSLTAttributeDef(Constants.S_XMLNAMESPACEURI, "space", XSLTAttributeDef.T_AVT, false); XSLTAttributeDef stylesheetPrefixAttr = new XSLTAttributeDef(null, "stylesheet-prefix", XSLTAttributeDef.T_CDATA, true); XSLTAttributeDef resultPrefixAttr = new XSLTAttributeDef(null, "result-prefix", XSLTAttributeDef.T_CDATA, true); XSLTAttributeDef disableOutputEscapingAttr = new XSLTAttributeDef(null, "disable-output-escaping", XSLTAttributeDef.T_YESNO, false); XSLTAttributeDef levelAttr = new XSLTAttributeDef(null, "level", false, "single", Constants.NUMBERLEVEL_SINGLE, "multiple", Constants.NUMBERLEVEL_MULTI, "any", Constants.NUMBERLEVEL_ANY); levelAttr.setDefault("single"); XSLTAttributeDef countAttr = new XSLTAttributeDef(null, "count", XSLTAttributeDef.T_PATTERN, false); XSLTAttributeDef fromAttr = new XSLTAttributeDef(null, "from", XSLTAttributeDef.T_PATTERN, false); XSLTAttributeDef valueAttr = new XSLTAttributeDef(null, "value", XSLTAttributeDef.T_EXPR, false); XSLTAttributeDef formatAttr = new XSLTAttributeDef(null, "format", XSLTAttributeDef.T_AVT, false); formatAttr.setDefault("1"); XSLTAttributeDef langAttr = new XSLTAttributeDef(null, "lang", XSLTAttributeDef.T_AVT, false); XSLTAttributeDef letterValueAttr = new XSLTAttributeDef(null, "letter-value", XSLTAttributeDef.T_AVT, false); XSLTAttributeDef groupingSeparatorAVT = new XSLTAttributeDef(null, "grouping-separator", XSLTAttributeDef.T_AVT, false); XSLTAttributeDef groupingSizeAttr = new XSLTAttributeDef(null, "grouping-size", XSLTAttributeDef.T_AVT, false); XSLTAttributeDef dataTypeAttr = new XSLTAttributeDef(null, "data-type", XSLTAttributeDef.T_AVT, "text"); XSLTAttributeDef orderAttr = new XSLTAttributeDef(null, "order", XSLTAttributeDef.T_AVT, "ascending"); XSLTAttributeDef caseOrderAttr = new XSLTAttributeDef(null, "case-order", XSLTAttributeDef.T_AVT, false); XSLTAttributeDef terminateAttr = new XSLTAttributeDef(null, "terminate", XSLTAttributeDef.T_YESNO, false); terminateAttr.setDefault("no"); XSLTAttributeDef xslExcludeResultPrefixesAttr = new XSLTAttributeDef(Constants.S_XSLNAMESPACEURL, "exclude-result-prefixes", XSLTAttributeDef.T_STRINGLIST, false); XSLTAttributeDef xslExtensionElementPrefixesAttr = new XSLTAttributeDef(Constants.S_XSLNAMESPACEURL, "extension-element-prefixes", XSLTAttributeDef.T_PREFIX_URLLIST, false); XSLTAttributeDef xslUseAttributeSetsAttr = new XSLTAttributeDef(Constants.S_XSLNAMESPACEURL, "use-attribute-sets", XSLTAttributeDef.T_QNAMES, false); XSLTAttributeDef xslVersionAttr = new XSLTAttributeDef(Constants.S_XSLNAMESPACEURL, "version", XSLTAttributeDef.T_NMTOKEN, false); XSLTElementDef charData = new XSLTElementDef(this, null, "text()", null /*alias */, null /* elements */, null, /* attributes */ new ProcessorCharacters(), ElemTextLiteral.class /* class object */); charData.setType(XSLTElementDef.T_PCDATA); XSLTElementDef whiteSpaceOnly = new XSLTElementDef(this, null, "text()", null /*alias */, null /* elements */, null, /* attributes */ null, ElemTextLiteral.class /* should be null? -sb */); charData.setType(XSLTElementDef.T_PCDATA); XSLTAttributeDef resultAttr = new XSLTAttributeDef(null, "*", XSLTAttributeDef.T_AVT, false); XSLTAttributeDef xslResultAttr = new XSLTAttributeDef(Constants.S_XSLNAMESPACEURL, "*", XSLTAttributeDef.T_CDATA, false); XSLTElementDef[] templateElements = new XSLTElementDef[21]; XSLTElementDef[] templateElementsAndParams = new XSLTElementDef[22]; XSLTElementDef[] templateElementsAndSort = new XSLTElementDef[22]; XSLTElementDef[] charTemplateElements = new XSLTElementDef[15]; XSLTElementDef resultElement = new XSLTElementDef(this, null, "*", null /*alias */, templateElements /* elements */, new XSLTAttributeDef[]{ spaceAttrLiteral, // special xslExcludeResultPrefixesAttr, xslExtensionElementPrefixesAttr, xslUseAttributeSetsAttr, xslVersionAttr, xslResultAttr, resultAttr }, new ProcessorLRE(), ElemLiteralResult.class /* class object */, 20, true); XSLTElementDef unknownElement = new XSLTElementDef(this, "*", "unknown", null /*alias */, templateElementsAndParams /* elements */, new XSLTAttributeDef[]{ xslExcludeResultPrefixesAttr, xslExtensionElementPrefixesAttr, xslUseAttributeSetsAttr, xslVersionAttr, xslResultAttr, resultAttr }, new ProcessorUnknown(), ElemUnknown.class /* class object */, 20, true); XSLTElementDef xslValueOf = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "value-of", null /*alias */, null /* elements */, new XSLTAttributeDef[]{ selectAttrRequired, disableOutputEscapingAttr }, new ProcessorTemplateElem(), ElemValueOf.class /* class object */, 20, true); XSLTElementDef xslCopyOf = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "copy-of", null /*alias */, null /* elements */, new XSLTAttributeDef[]{ selectAttrRequired }, new ProcessorTemplateElem(), ElemCopyOf.class /* class object */, 20, true); XSLTElementDef xslNumber = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "number", null /*alias */, null /* elements */, new XSLTAttributeDef[]{ levelAttr, countAttr, fromAttr, valueAttr, formatAttr, langAttr, letterValueAttr, groupingSeparatorAVT, groupingSizeAttr }, new ProcessorTemplateElem(), ElemNumber.class /* class object */, 20, true); // <!-- xsl:sort cannot occur after any other elements or // any non-whitespace character --> XSLTElementDef xslSort = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "sort", null /*alias */, null /* elements */, new XSLTAttributeDef[]{ selectAttrDefDot, langAttr, dataTypeAttr, orderAttr, caseOrderAttr }, new ProcessorTemplateElem(), ElemSort.class/* class object */, 19, true ); XSLTElementDef xslWithParam = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "with-param", null /*alias */, templateElements /* elements */, // %template;> new XSLTAttributeDef[]{ nameAttrRequired, selectAttrOpt }, new ProcessorTemplateElem(), ElemWithParam.class /* class object */); XSLTElementDef xslApplyTemplates = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "apply-templates", null /*alias */, new XSLTElementDef[]{ xslSort, xslWithParam } /* elements */, new XSLTAttributeDef[]{ selectAttrDefNode, modeAttr }, new ProcessorTemplateElem(), ElemApplyTemplates.class /* class object */, 20, true); XSLTElementDef xslApplyImports = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "apply-imports", null /*alias */, null /* elements */, new XSLTAttributeDef[]{}, new ProcessorTemplateElem(), ElemApplyImport.class /* class object */); XSLTElementDef xslForEach = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "for-each", null /*alias */, templateElementsAndSort, // (#PCDATA %instructions; %result-elements; | xsl:sort)* new XSLTAttributeDef[]{ selectAttrRequired, spaceAttr }, new ProcessorTemplateElem(), ElemForEach.class /* class object */, true, false, true, 20, true); XSLTElementDef xslIf = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "if", null /*alias */, templateElements /* elements */, // %template; new XSLTAttributeDef[]{ testAttrRequired, spaceAttr }, new ProcessorTemplateElem(), ElemIf.class /* class object */, 20, true); XSLTElementDef xslWhen = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "when", null /*alias */, templateElements /* elements */, // %template;> new XSLTAttributeDef[]{ testAttrRequired, spaceAttr }, new ProcessorTemplateElem(), ElemWhen.class /* class object */, false, true, 1, true); XSLTElementDef xslOtherwise = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "otherwise", null /*alias */, templateElements /* elements */, // %template;> new XSLTAttributeDef[]{ spaceAttr }, new ProcessorTemplateElem(), ElemOtherwise.class /* class object */, false, false, 2, false); XSLTElementDef xslChoose = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "choose", null /*alias */, new XSLTElementDef[]{ xslWhen, xslOtherwise } /* elements */, new XSLTAttributeDef[]{ spaceAttr }, new ProcessorTemplateElem(), ElemChoose.class /* class object */, true, false, true, 20, true); XSLTElementDef xslAttribute = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "attribute", null /*alias */, charTemplateElements /* elements */, // %char-template;> new XSLTAttributeDef[]{ nameAVTRequired, namespaceAVTOpt, spaceAttr }, new ProcessorTemplateElem(), ElemAttribute.class /* class object */, 20, true); XSLTElementDef xslCallTemplate = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "call-template", null /*alias */, new XSLTElementDef[]{ xslWithParam } /* elements */, new XSLTAttributeDef[]{ nameAttrRequired }, new ProcessorTemplateElem(), ElemCallTemplate.class /* class object */, 20, true); XSLTElementDef xslVariable = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "variable", null /*alias */, templateElements /* elements */, // %template;> new XSLTAttributeDef[]{ nameAttrRequired, selectAttrOpt }, new ProcessorTemplateElem(), ElemVariable.class /* class object */, 20, true); XSLTElementDef xslParam = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "param", null /*alias */, templateElements /* elements */, // %template;> new XSLTAttributeDef[]{ nameAttrRequired, selectAttrOpt }, new ProcessorTemplateElem(), ElemParam.class /* class object */, 19, true); XSLTElementDef xslText = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "text", null /*alias */, new XSLTElementDef[]{ charData } /* elements */, new XSLTAttributeDef[]{ disableOutputEscapingAttr }, new ProcessorText(), ElemText.class /* class object */, 20, true); XSLTElementDef xslProcessingInstruction = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "processing-instruction", null /*alias */, charTemplateElements /* elements */, // %char-template;> new XSLTAttributeDef[]{ nameAVTRequired, spaceAttr }, new ProcessorTemplateElem(), ElemPI.class /* class object */, 20, true); XSLTElementDef xslElement = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "element", null /*alias */, templateElements /* elements */, // %template; new XSLTAttributeDef[]{ nameAVTRequired, namespaceAVTOpt, useAttributeSetsAttr, spaceAttr }, new ProcessorTemplateElem(), ElemElement.class /* class object */, 20, true); XSLTElementDef xslComment = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "comment", null /*alias */, charTemplateElements /* elements */, // %char-template;> new XSLTAttributeDef[]{ spaceAttr }, new ProcessorTemplateElem(), ElemComment.class /* class object */, 20, true); XSLTElementDef xslCopy = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "copy", null /*alias */, templateElements /* elements */, // %template;> new XSLTAttributeDef[]{ spaceAttr, useAttributeSetsAttr }, new ProcessorTemplateElem(), ElemCopy.class /* class object */, 20, true); XSLTElementDef xslMessage = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "message", null /*alias */, templateElements /* elements */, // %template;> new XSLTAttributeDef[]{ terminateAttr }, new ProcessorTemplateElem(), ElemMessage.class /* class object */, 20, true); XSLTElementDef xslFallback = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "fallback", null /*alias */, templateElements /* elements */, // %template;> new XSLTAttributeDef[]{ spaceAttr }, new ProcessorTemplateElem(), ElemFallback.class /* class object */, 20, true); int i = 0; templateElements[i++] = charData; // #PCDATA // char-instructions templateElements[i++] = xslApplyTemplates; templateElements[i++] = xslCallTemplate; templateElements[i++] = xslApplyImports; templateElements[i++] = xslForEach; templateElements[i++] = xslValueOf; templateElements[i++] = xslCopyOf; templateElements[i++] = xslNumber; templateElements[i++] = xslChoose; templateElements[i++] = xslIf; templateElements[i++] = xslText; templateElements[i++] = xslCopy; templateElements[i++] = xslVariable; templateElements[i++] = xslMessage; templateElements[i++] = xslFallback; // instructions templateElements[i++] = xslProcessingInstruction; templateElements[i++] = xslComment; templateElements[i++] = xslElement; templateElements[i++] = xslAttribute; templateElements[i++] = resultElement; templateElements[i++] = unknownElement; int k; for (k = 0; k < i; k++) { templateElementsAndParams[k] = templateElements[k]; } templateElementsAndParams[k] = xslParam; for (k = 0; k < i; k++) { templateElementsAndSort[k] = templateElements[k]; } templateElementsAndSort[k] = xslSort; i = 0; charTemplateElements[i++] = charData; // #PCDATA // char-instructions charTemplateElements[i++] = xslApplyTemplates; charTemplateElements[i++] = xslCallTemplate; charTemplateElements[i++] = xslApplyImports; charTemplateElements[i++] = xslForEach; charTemplateElements[i++] = xslValueOf; charTemplateElements[i++] = xslCopyOf; charTemplateElements[i++] = xslNumber; charTemplateElements[i++] = xslChoose; charTemplateElements[i++] = xslIf; charTemplateElements[i++] = xslText; charTemplateElements[i++] = xslCopy; charTemplateElements[i++] = xslVariable; charTemplateElements[i++] = xslMessage; charTemplateElements[i++] = xslFallback; XSLTElementDef importDef = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "import", null /*alias */, null /* elements */, new XSLTAttributeDef[]{ hrefAttr }, // EMPTY new ProcessorImport(), null /* class object */, 1, true); XSLTElementDef includeDef = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "include", null /*alias */, null /* elements */, // EMPTY new XSLTAttributeDef[]{ hrefAttr }, new ProcessorInclude(), null /* class object */, 20, true); XSLTElementDef[] topLevelElements = new XSLTElementDef[]{ includeDef, importDef, // resultElement, whiteSpaceOnly, unknownElement, new XSLTElementDef( this, Constants.S_XSLNAMESPACEURL, "strip-space", null /*alias */, null /* elements */, new XSLTAttributeDef[]{ elementsAttr }, new ProcessorStripSpace(), null /* class object */, 20, true), new XSLTElementDef( this, Constants.S_XSLNAMESPACEURL, "preserve-space", null /*alias */, null /* elements */, new XSLTAttributeDef[]{ elementsAttr }, new ProcessorPreserveSpace(), null /* class object */, 20, true), new XSLTElementDef( this, Constants.S_XSLNAMESPACEURL, "output", null /*alias */, null /* elements */, new XSLTAttributeDef[]{ methodAttr, versionAttr, encodingAttr, omitXmlDeclarationAttr, standaloneAttr, doctypePublicAttr, doctypeSystemAttr, cdataSectionElementsAttr, indentAttr, mediaTypeAttr, XSLTAttributeDef.m_foreignAttr }, new ProcessorOutputElem(), null /* class object */, 20, true), new XSLTElementDef( this, Constants.S_XSLNAMESPACEURL, "key", null /*alias */, null /* elements */, // EMPTY new XSLTAttributeDef[]{ nameAttrRequired, matchAttrRequired, useAttr }, new ProcessorKey(), null /* class object */, 20, true), new XSLTElementDef( this, Constants.S_XSLNAMESPACEURL, "decimal-format", null /*alias */, null /* elements */, // EMPTY new XSLTAttributeDef[]{ nameAttrOpt, decimalSeparatorAttr, groupingSeparatorAttr, infinityAttr, minusSignAttr, NaNAttr, percentAttr, perMilleAttr, zeroDigitAttr, digitAttr, patternSeparatorAttr }, new ProcessorDecimalFormat(), null /* class object */, 20, true), new XSLTElementDef( this, Constants.S_XSLNAMESPACEURL, "attribute-set", null /*alias */, new XSLTElementDef[]{ xslAttribute } /* elements */, new XSLTAttributeDef[]{ nameAttrRequired, useAttributeSetsAttr }, new ProcessorAttributeSet(), null /* class object */, 20, true), new XSLTElementDef( this, Constants.S_XSLNAMESPACEURL, "variable", null /*alias */, templateElements /* elements */, new XSLTAttributeDef[]{ nameAttrRequired, selectAttrOpt }, new ProcessorGlobalVariableDecl(), ElemVariable.class /* class object */, 20, true), new XSLTElementDef( this, Constants.S_XSLNAMESPACEURL, "param", null /*alias */, templateElements /* elements */, new XSLTAttributeDef[]{ nameAttrRequired, selectAttrOpt }, new ProcessorGlobalParamDecl(), ElemParam.class /* class object */, 20, true), new XSLTElementDef( this, Constants.S_XSLNAMESPACEURL, "template", null /*alias */, templateElementsAndParams /* elements */, new XSLTAttributeDef[]{ matchAttrOpt, nameAttrOpt, priorityAttr, modeAttr, spaceAttr }, new ProcessorTemplate(), ElemTemplate.class /* class object */, 20, true), new XSLTElementDef( this, Constants.S_XSLNAMESPACEURL, "namespace-alias", null /*alias */, null /* elements */, // EMPTY new XSLTAttributeDef[]{ stylesheetPrefixAttr, resultPrefixAttr }, new ProcessorNamespaceAlias(), null /* class object */, 20, true), new XSLTElementDef( this, Constants.S_BUILTIN_EXTENSIONS_URL, "component", null /*alias */, new XSLTElementDef[]{ new XSLTElementDef( this, Constants.S_BUILTIN_EXTENSIONS_URL, "script", null /*alias */, new XSLTElementDef[]{ charData } /* elements */, new XSLTAttributeDef[]{ new XSLTAttributeDef( null, "lang", XSLTAttributeDef.T_NMTOKEN, true), new XSLTAttributeDef(null, "src", XSLTAttributeDef.T_URL, false) }, new ProcessorLRE(), ElemExtensionScript.class /* class object */, 20, true) }, // EMPTY new XSLTAttributeDef[]{ new XSLTAttributeDef(null, "prefix", XSLTAttributeDef.T_NMTOKEN, true), new XSLTAttributeDef(null, "elements", XSLTAttributeDef.T_STRINGLIST, false), new XSLTAttributeDef(null, "functions", XSLTAttributeDef.T_STRINGLIST, false) }, new ProcessorLRE(), ElemExtensionDecl.class /* class object */) }; XSLTAttributeDef excludeResultPrefixesAttr = new XSLTAttributeDef(null, "exclude-result-prefixes", XSLTAttributeDef.T_STRINGLIST, false); XSLTAttributeDef extensionElementPrefixesAttr = new XSLTAttributeDef(null, "extension-element-prefixes", XSLTAttributeDef.T_PREFIX_URLLIST, false); XSLTAttributeDef idAttr = new XSLTAttributeDef(null, "id", XSLTAttributeDef.T_CDATA, false); XSLTAttributeDef versionAttrRequired = new XSLTAttributeDef(null, "version", XSLTAttributeDef.T_NMTOKEN, true); XSLTElementDef stylesheetElemDef = new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "stylesheet", "transform", topLevelElements, new XSLTAttributeDef[]{ extensionElementPrefixesAttr, excludeResultPrefixesAttr, idAttr, versionAttrRequired, spaceAttr }, new ProcessorStylesheetElement(), /* ContentHandler */ null /* class object */, true, -1, false); importDef.setElements(new XSLTElementDef[]{ stylesheetElemDef, resultElement, unknownElement }); includeDef.setElements(new XSLTElementDef[]{ stylesheetElemDef, resultElement, unknownElement }); build(null, null, null, new XSLTElementDef[]{ stylesheetElemDef, whiteSpaceOnly, resultElement, unknownElement }, null, new ProcessorStylesheetDoc(), /* ContentHandler */ null /* class object */ ); } /** * A hashtable of all available built-in elements for use by the element-available * function. * TODO: When we convert to Java2, this should be a Set. */ private Hashtable m_availElems = new Hashtable(); /** * Get the table of available elements. * * @return table of available elements, keyed by qualified names, and with * values of the same qualified names. */ public Hashtable getElemsAvailable() { return m_availElems; } /** * Adds a new element name to the Hashtable of available elements. * @param elemName The name of the element to add to the Hashtable of available elements. */ void addAvailableElement(QName elemName) { m_availElems.put(elemName, elemName); } /** * Determines whether the passed element name is present in the list of available elements. * @param elemName The name of the element to look up. * * @return true if an element corresponding to elemName is available. */ public boolean elementAvailable(QName elemName) { return m_availElems.containsKey(elemName); } }