/* * 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: XSLTSchema.java 476466 2006-11-18 08:22:31Z minchau $ */ package org.apache.xalan.processor; import java.util.HashMap; import org.apache.xalan.templates.Constants; import org.apache.xalan.templates.ElemApplyImport; import org.apache.xalan.templates.ElemApplyTemplates; import org.apache.xalan.templates.ElemAttribute; import org.apache.xalan.templates.ElemCallTemplate; import org.apache.xalan.templates.ElemChoose; import org.apache.xalan.templates.ElemComment; import org.apache.xalan.templates.ElemCopy; import org.apache.xalan.templates.ElemCopyOf; import org.apache.xalan.templates.ElemElement; import org.apache.xalan.templates.ElemExsltFuncResult; import org.apache.xalan.templates.ElemExsltFunction; import org.apache.xalan.templates.ElemExtensionDecl; import org.apache.xalan.templates.ElemExtensionScript; import org.apache.xalan.templates.ElemFallback; import org.apache.xalan.templates.ElemForEach; import org.apache.xalan.templates.ElemIf; import org.apache.xalan.templates.ElemLiteralResult; import org.apache.xalan.templates.ElemMessage; import org.apache.xalan.templates.ElemNumber; import org.apache.xalan.templates.ElemOtherwise; import org.apache.xalan.templates.ElemPI; import org.apache.xalan.templates.ElemParam; import org.apache.xalan.templates.ElemSort; import org.apache.xalan.templates.ElemTemplate; import org.apache.xalan.templates.ElemText; import org.apache.xalan.templates.ElemTextLiteral; import org.apache.xalan.templates.ElemUnknown; import org.apache.xalan.templates.ElemValueOf; import org.apache.xalan.templates.ElemVariable; import org.apache.xalan.templates.ElemWhen; import org.apache.xalan.templates.ElemWithParam; 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() { // xsl:import, xsl:include XSLTAttributeDef hrefAttr = new XSLTAttributeDef(null, "href", XSLTAttributeDef.T_URL, true, false,XSLTAttributeDef.ERROR); // xsl:preserve-space, xsl:strip-space XSLTAttributeDef elementsAttr = new XSLTAttributeDef(null, "elements", XSLTAttributeDef.T_SIMPLEPATTERNLIST, true, false, XSLTAttributeDef.ERROR); // XSLTAttributeDef anyNamespacedAttr = new XSLTAttributeDef("*", "*", // XSLTAttributeDef.T_CDATA, false); // xsl:output XSLTAttributeDef methodAttr = new XSLTAttributeDef(null, "method", XSLTAttributeDef.T_QNAME, false, false,XSLTAttributeDef.ERROR); XSLTAttributeDef versionAttr = new XSLTAttributeDef(null, "version", XSLTAttributeDef.T_NMTOKEN, false, false,XSLTAttributeDef.ERROR); XSLTAttributeDef encodingAttr = new XSLTAttributeDef(null, "encoding", XSLTAttributeDef.T_CDATA, false, false,XSLTAttributeDef.ERROR); XSLTAttributeDef omitXmlDeclarationAttr = new XSLTAttributeDef(null, "omit-xml-declaration", XSLTAttributeDef.T_YESNO, false, false,XSLTAttributeDef.ERROR); XSLTAttributeDef standaloneAttr = new XSLTAttributeDef(null, "standalone", XSLTAttributeDef.T_YESNO, false, false,XSLTAttributeDef.ERROR); XSLTAttributeDef doctypePublicAttr = new XSLTAttributeDef(null, "doctype-public", XSLTAttributeDef.T_CDATA, false, false,XSLTAttributeDef.ERROR); XSLTAttributeDef doctypeSystemAttr = new XSLTAttributeDef(null, "doctype-system", XSLTAttributeDef.T_CDATA, false, false,XSLTAttributeDef.ERROR); XSLTAttributeDef cdataSectionElementsAttr = new XSLTAttributeDef(null, "cdata-section-elements", XSLTAttributeDef.T_QNAMES_RESOLVE_NULL, false, false,XSLTAttributeDef.ERROR); XSLTAttributeDef indentAttr = new XSLTAttributeDef(null, "indent", XSLTAttributeDef.T_YESNO, false, false,XSLTAttributeDef.ERROR); XSLTAttributeDef mediaTypeAttr = new XSLTAttributeDef(null, "media-type", XSLTAttributeDef.T_CDATA, false, false,XSLTAttributeDef.ERROR); // Required. // It is an error if the name attribute is invalid on any of these elements // xsl:key, xsl:attribute-set, xsl:call-template, xsl:with-param, xsl:variable, xsl:param XSLTAttributeDef nameAttrRequired = new XSLTAttributeDef(null, "name", XSLTAttributeDef.T_QNAME, true, false,XSLTAttributeDef.ERROR); // Required. // Support AVT // xsl:element, xsl:attribute XSLTAttributeDef nameAVTRequired = new XSLTAttributeDef(null, "name", XSLTAttributeDef.T_AVT_QNAME, true, true,XSLTAttributeDef.WARNING); // Required. // Support AVT // xsl:processing-instruction XSLTAttributeDef nameAVT_NCNAMERequired = new XSLTAttributeDef(null, "name", XSLTAttributeDef.T_NCNAME, true, true,XSLTAttributeDef.WARNING); // Optional. // Static error if invalid // xsl:template, xsl:decimal-format XSLTAttributeDef nameAttrOpt_ERROR = new XSLTAttributeDef(null, "name", XSLTAttributeDef.T_QNAME, false, false,XSLTAttributeDef.ERROR); // xsl:key XSLTAttributeDef useAttr = new XSLTAttributeDef(null, "use", XSLTAttributeDef.T_EXPR, true, false,XSLTAttributeDef.ERROR); // xsl:element, xsl:attribute XSLTAttributeDef namespaceAVTOpt = new XSLTAttributeDef(null, "namespace",XSLTAttributeDef.T_URL, false, true,XSLTAttributeDef.WARNING); // xsl:decimal-format XSLTAttributeDef decimalSeparatorAttr = new XSLTAttributeDef(null, "decimal-separator", XSLTAttributeDef.T_CHAR, false,XSLTAttributeDef.ERROR, "."); XSLTAttributeDef infinityAttr = new XSLTAttributeDef(null, "infinity", XSLTAttributeDef.T_CDATA, false,XSLTAttributeDef.ERROR,"Infinity"); XSLTAttributeDef minusSignAttr = new XSLTAttributeDef(null, "minus-sign", XSLTAttributeDef.T_CHAR, false,XSLTAttributeDef.ERROR,"-"); XSLTAttributeDef NaNAttr = new XSLTAttributeDef(null, "NaN", XSLTAttributeDef.T_CDATA, false,XSLTAttributeDef.ERROR, "NaN"); XSLTAttributeDef percentAttr = new XSLTAttributeDef(null, "percent", XSLTAttributeDef.T_CHAR, false,XSLTAttributeDef.ERROR, "%"); XSLTAttributeDef perMilleAttr = new XSLTAttributeDef(null, "per-mille", XSLTAttributeDef.T_CHAR, false, false,XSLTAttributeDef.ERROR /* ,"‰" */); XSLTAttributeDef zeroDigitAttr = new XSLTAttributeDef(null, "zero-digit", XSLTAttributeDef.T_CHAR, false,XSLTAttributeDef.ERROR, "0"); XSLTAttributeDef digitAttr = new XSLTAttributeDef(null, "digit", XSLTAttributeDef.T_CHAR, false,XSLTAttributeDef.ERROR, "#"); XSLTAttributeDef patternSeparatorAttr = new XSLTAttributeDef(null, "pattern-separator", XSLTAttributeDef.T_CHAR, false,XSLTAttributeDef.ERROR, ";"); // xsl:decimal-format XSLTAttributeDef groupingSeparatorAttr = new XSLTAttributeDef(null, "grouping-separator", XSLTAttributeDef.T_CHAR, false,XSLTAttributeDef.ERROR,","); // xsl:element, xsl:attribute-set, xsl:copy XSLTAttributeDef useAttributeSetsAttr = new XSLTAttributeDef(null, "use-attribute-sets", XSLTAttributeDef.T_QNAMES, false, false, XSLTAttributeDef.ERROR); // xsl:if, xsl:when XSLTAttributeDef testAttrRequired = new XSLTAttributeDef(null, "test", XSLTAttributeDef.T_EXPR, true, false,XSLTAttributeDef.ERROR); // Required. // xsl:value-of, xsl:for-each, xsl:copy-of XSLTAttributeDef selectAttrRequired = new XSLTAttributeDef(null, "select", XSLTAttributeDef.T_EXPR, true, false,XSLTAttributeDef.ERROR); // Optional. // xsl:variable, xsl:param, xsl:with-param XSLTAttributeDef selectAttrOpt = new XSLTAttributeDef(null, "select", XSLTAttributeDef.T_EXPR, false, false,XSLTAttributeDef.ERROR); // Optional. // Default: "node()" // xsl:apply-templates XSLTAttributeDef selectAttrDefNode = new XSLTAttributeDef(null, "select", XSLTAttributeDef.T_EXPR, false,XSLTAttributeDef.ERROR, "node()"); // Optional. // Default: "." // xsl:sort XSLTAttributeDef selectAttrDefDot = new XSLTAttributeDef(null, "select", XSLTAttributeDef.T_EXPR, false,XSLTAttributeDef.ERROR, "."); // xsl:key XSLTAttributeDef matchAttrRequired = new XSLTAttributeDef(null, "match", XSLTAttributeDef.T_PATTERN, true, false,XSLTAttributeDef.ERROR); // xsl:template XSLTAttributeDef matchAttrOpt = new XSLTAttributeDef(null, "match", XSLTAttributeDef.T_PATTERN, false, false,XSLTAttributeDef.ERROR); // xsl:template XSLTAttributeDef priorityAttr = new XSLTAttributeDef(null, "priority", XSLTAttributeDef.T_NUMBER, false, false,XSLTAttributeDef.ERROR); // xsl:template, xsl:apply-templates XSLTAttributeDef modeAttr = new XSLTAttributeDef(null, "mode", XSLTAttributeDef.T_QNAME, false, false,XSLTAttributeDef.ERROR); XSLTAttributeDef spaceAttr = new XSLTAttributeDef(Constants.S_XMLNAMESPACEURI, "space", false, false, false, XSLTAttributeDef.WARNING, "default", Constants.ATTRVAL_STRIP, "preserve", Constants.ATTRVAL_PRESERVE); XSLTAttributeDef spaceAttrLiteral = new XSLTAttributeDef(Constants.S_XMLNAMESPACEURI, "space", XSLTAttributeDef.T_URL, false, true,XSLTAttributeDef.ERROR); // xsl:namespace-alias XSLTAttributeDef stylesheetPrefixAttr = new XSLTAttributeDef(null, "stylesheet-prefix", XSLTAttributeDef.T_CDATA, true, false,XSLTAttributeDef.ERROR); XSLTAttributeDef resultPrefixAttr = new XSLTAttributeDef(null, "result-prefix", XSLTAttributeDef.T_CDATA, true, false,XSLTAttributeDef.ERROR); // xsl:text, xsl:value-of XSLTAttributeDef disableOutputEscapingAttr = new XSLTAttributeDef(null, "disable-output-escaping", XSLTAttributeDef.T_YESNO, false, false,XSLTAttributeDef.ERROR); // xsl:number XSLTAttributeDef levelAttr = new XSLTAttributeDef(null, "level", false, false, false, XSLTAttributeDef.ERROR, "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, false,XSLTAttributeDef.ERROR); XSLTAttributeDef fromAttr = new XSLTAttributeDef(null, "from", XSLTAttributeDef.T_PATTERN, false, false,XSLTAttributeDef.ERROR); XSLTAttributeDef valueAttr = new XSLTAttributeDef(null, "value", XSLTAttributeDef.T_EXPR, false, false,XSLTAttributeDef.ERROR); XSLTAttributeDef formatAttr = new XSLTAttributeDef(null, "format", XSLTAttributeDef.T_CDATA, false, true,XSLTAttributeDef.ERROR); formatAttr.setDefault("1"); // xsl:number, xsl:sort XSLTAttributeDef langAttr = new XSLTAttributeDef(null, "lang", XSLTAttributeDef.T_NMTOKEN, false, true,XSLTAttributeDef.ERROR); // xsl:number XSLTAttributeDef letterValueAttr = new XSLTAttributeDef(null, "letter-value", false, true, false, XSLTAttributeDef.ERROR, "alphabetic", Constants.NUMBERLETTER_ALPHABETIC, "traditional", Constants.NUMBERLETTER_TRADITIONAL); // xsl:number XSLTAttributeDef groupingSeparatorAVT = new XSLTAttributeDef(null, "grouping-separator", XSLTAttributeDef.T_CHAR, false, true,XSLTAttributeDef.ERROR); // xsl:number XSLTAttributeDef groupingSizeAttr = new XSLTAttributeDef(null, "grouping-size", XSLTAttributeDef.T_NUMBER, false, true,XSLTAttributeDef.ERROR); // xsl:sort XSLTAttributeDef dataTypeAttr = new XSLTAttributeDef(null, "data-type", false, true, true, XSLTAttributeDef.ERROR, "text", Constants.SORTDATATYPE_TEXT ,"number", Constants.SORTDATATYPE_TEXT); dataTypeAttr.setDefault("text"); // xsl:sort XSLTAttributeDef orderAttr = new XSLTAttributeDef(null, "order", false, true, false,XSLTAttributeDef.ERROR, "ascending", Constants.SORTORDER_ASCENDING, "descending", Constants.SORTORDER_DESCENDING); orderAttr.setDefault("ascending"); // xsl:sort XSLTAttributeDef caseOrderAttr = new XSLTAttributeDef(null, "case-order", false, true, false,XSLTAttributeDef.ERROR, "upper-first", Constants.SORTCASEORDER_UPPERFIRST , "lower-first", Constants.SORTCASEORDER_LOWERFIRST); // xsl:message XSLTAttributeDef terminateAttr = new XSLTAttributeDef(null, "terminate", XSLTAttributeDef.T_YESNO, false, false,XSLTAttributeDef.ERROR); terminateAttr.setDefault("no"); // top level attributes XSLTAttributeDef xslExcludeResultPrefixesAttr = new XSLTAttributeDef(Constants.S_XSLNAMESPACEURL, "exclude-result-prefixes", XSLTAttributeDef.T_PREFIXLIST, false, false,XSLTAttributeDef.ERROR); XSLTAttributeDef xslExtensionElementPrefixesAttr = new XSLTAttributeDef(Constants.S_XSLNAMESPACEURL, "extension-element-prefixes", XSLTAttributeDef.T_PREFIX_URLLIST, false, false,XSLTAttributeDef.ERROR); // result-element-atts XSLTAttributeDef xslUseAttributeSetsAttr = new XSLTAttributeDef(Constants.S_XSLNAMESPACEURL, "use-attribute-sets", XSLTAttributeDef.T_QNAMES, false, false,XSLTAttributeDef.ERROR); XSLTAttributeDef xslVersionAttr = new XSLTAttributeDef(Constants.S_XSLNAMESPACEURL, "version", XSLTAttributeDef.T_NMTOKEN, false, false,XSLTAttributeDef.ERROR); 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, true,XSLTAttributeDef.WARNING); XSLTAttributeDef xslResultAttr = new XSLTAttributeDef(Constants.S_XSLNAMESPACEURL, "*", XSLTAttributeDef.T_CDATA, false, false,XSLTAttributeDef.WARNING); XSLTElementDef[] templateElements = new XSLTElementDef[23]; XSLTElementDef[] templateElementsAndParams = new XSLTElementDef[24]; XSLTElementDef[] templateElementsAndSort = new XSLTElementDef[24]; //exslt XSLTElementDef[] exsltFunctionElements = new XSLTElementDef[24]; 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 */, 19, true); 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[]{ nameAVT_NCNAMERequired, 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); //exslt XSLTElementDef exsltFunction = new XSLTElementDef(this, Constants.S_EXSLT_FUNCTIONS_URL, "function", null /*alias */, exsltFunctionElements /* elements */, new XSLTAttributeDef[]{ nameAttrRequired }, new ProcessorExsltFunction(), ElemExsltFunction.class /* class object */); XSLTElementDef exsltResult = new XSLTElementDef(this, Constants.S_EXSLT_FUNCTIONS_URL, "result", null /*alias */, templateElements /* elements */, new XSLTAttributeDef[]{ selectAttrOpt }, new ProcessorExsltFuncResult(), ElemExsltFuncResult.class /* class object */); 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; templateElements[i++] = exsltFunction; templateElements[i++] = exsltResult; System.arraycopy(templateElements, 0, templateElementsAndParams, 0, i); System.arraycopy(templateElements, 0, templateElementsAndSort, 0, i); System.arraycopy(templateElements, 0, exsltFunctionElements, 0, i); templateElementsAndParams[i] = xslParam; templateElementsAndSort[i] = xslSort; exsltFunctionElements[i] = xslParam; 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); XSLTAttributeDef[] scriptAttrs = new XSLTAttributeDef[]{ new XSLTAttributeDef(null, "lang", XSLTAttributeDef.T_NMTOKEN, true, false,XSLTAttributeDef.WARNING), new XSLTAttributeDef(null, "src", XSLTAttributeDef.T_URL, false, false,XSLTAttributeDef.WARNING)}; XSLTAttributeDef[] componentAttrs = new XSLTAttributeDef[]{ new XSLTAttributeDef(null, "prefix", XSLTAttributeDef.T_NMTOKEN, true, false,XSLTAttributeDef.WARNING), new XSLTAttributeDef(null, "elements", XSLTAttributeDef.T_STRINGLIST, false, false,XSLTAttributeDef.WARNING), new XSLTAttributeDef(null, "functions", XSLTAttributeDef.T_STRINGLIST, false, false,XSLTAttributeDef.WARNING) }; 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_ERROR, 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_ERROR, priorityAttr, modeAttr, spaceAttr }, new ProcessorTemplate(), ElemTemplate.class /* class object */, true, 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 */, scriptAttrs, new ProcessorLRE(), ElemExtensionScript.class /* class object */, 20, true) }, // EMPTY componentAttrs, new ProcessorLRE(), ElemExtensionDecl.class /* class object */), new XSLTElementDef( this, Constants.S_BUILTIN_OLD_EXTENSIONS_URL, "component", null /*alias */, new XSLTElementDef[]{ new XSLTElementDef( this, Constants.S_BUILTIN_OLD_EXTENSIONS_URL, "script", null /*alias */, new XSLTElementDef[]{ charData } /* elements */, scriptAttrs, new ProcessorLRE(), ElemExtensionScript.class /* class object */, 20, true) }, // EMPTY componentAttrs, new ProcessorLRE(), ElemExtensionDecl.class /* class object */), exsltFunction}/* exslt */; //end of topevelElements XSLTAttributeDef excludeResultPrefixesAttr = new XSLTAttributeDef(null, "exclude-result-prefixes", XSLTAttributeDef.T_PREFIXLIST, false,false,XSLTAttributeDef.WARNING); XSLTAttributeDef extensionElementPrefixesAttr = new XSLTAttributeDef(null, "extension-element-prefixes", XSLTAttributeDef.T_PREFIX_URLLIST, false,false,XSLTAttributeDef.WARNING); XSLTAttributeDef idAttr = new XSLTAttributeDef(null, "id", XSLTAttributeDef.T_CDATA, false,false,XSLTAttributeDef.WARNING); XSLTAttributeDef versionAttrRequired = new XSLTAttributeDef(null, "version", XSLTAttributeDef.T_NMTOKEN, true,false,XSLTAttributeDef.WARNING); 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 HashMap m_availElems = new HashMap(); /** * Get the table of available elements. * * @return table of available elements, keyed by qualified names, and with * values of the same qualified names. */ public HashMap 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); } }