1/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the  "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 *     http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18/*
19 * $Id: XSLTSchema.java 476466 2006-11-18 08:22:31Z minchau $
20 */
21package org.apache.xalan.processor;
22
23import java.util.HashMap;
24
25import org.apache.xalan.templates.Constants;
26import org.apache.xalan.templates.ElemApplyImport;
27import org.apache.xalan.templates.ElemApplyTemplates;
28import org.apache.xalan.templates.ElemAttribute;
29import org.apache.xalan.templates.ElemCallTemplate;
30import org.apache.xalan.templates.ElemChoose;
31import org.apache.xalan.templates.ElemComment;
32import org.apache.xalan.templates.ElemCopy;
33import org.apache.xalan.templates.ElemCopyOf;
34import org.apache.xalan.templates.ElemElement;
35import org.apache.xalan.templates.ElemExsltFuncResult;
36import org.apache.xalan.templates.ElemExsltFunction;
37import org.apache.xalan.templates.ElemExtensionDecl;
38import org.apache.xalan.templates.ElemExtensionScript;
39import org.apache.xalan.templates.ElemFallback;
40import org.apache.xalan.templates.ElemForEach;
41import org.apache.xalan.templates.ElemIf;
42import org.apache.xalan.templates.ElemLiteralResult;
43import org.apache.xalan.templates.ElemMessage;
44import org.apache.xalan.templates.ElemNumber;
45import org.apache.xalan.templates.ElemOtherwise;
46import org.apache.xalan.templates.ElemPI;
47import org.apache.xalan.templates.ElemParam;
48import org.apache.xalan.templates.ElemSort;
49import org.apache.xalan.templates.ElemTemplate;
50import org.apache.xalan.templates.ElemText;
51import org.apache.xalan.templates.ElemTextLiteral;
52import org.apache.xalan.templates.ElemUnknown;
53import org.apache.xalan.templates.ElemValueOf;
54import org.apache.xalan.templates.ElemVariable;
55import org.apache.xalan.templates.ElemWhen;
56import org.apache.xalan.templates.ElemWithParam;
57import org.apache.xml.utils.QName;
58
59/**
60 * This class defines the allowed structure for a stylesheet, and the
61 * mapping between Xalan classes and the markup elements in the stylesheet.
62 * @see <a href="http://www.w3.org/TR/xslt#dtd">XSLT DTD</a>
63 */
64public class XSLTSchema extends XSLTElementDef
65{
66
67  /**
68   * Construct a XSLTSchema which represents the XSLT "schema".
69   */
70  XSLTSchema()
71  {
72    build();
73  }
74
75  /**
76   * This method builds an XSLT "schema" according to http://www.w3.org/TR/xslt#dtd.  This
77   * schema provides instructions for building the Xalan Stylesheet (Templates) structure.
78   */
79  void build()
80  {
81	// xsl:import, xsl:include
82    XSLTAttributeDef hrefAttr = new XSLTAttributeDef(null, "href",
83                                  XSLTAttributeDef.T_URL, true, false,XSLTAttributeDef.ERROR);
84
85	// xsl:preserve-space, xsl:strip-space
86    XSLTAttributeDef elementsAttr = new XSLTAttributeDef(null, "elements",
87                                      XSLTAttributeDef.T_SIMPLEPATTERNLIST,
88                                      true, false, XSLTAttributeDef.ERROR);
89
90    // XSLTAttributeDef anyNamespacedAttr = new XSLTAttributeDef("*", "*",
91    //                                XSLTAttributeDef.T_CDATA, false);
92
93    // xsl:output
94    XSLTAttributeDef methodAttr = new XSLTAttributeDef(null, "method",
95                                    XSLTAttributeDef.T_QNAME, false, false,XSLTAttributeDef.ERROR);
96    XSLTAttributeDef versionAttr = new XSLTAttributeDef(null, "version",
97                                     XSLTAttributeDef.T_NMTOKEN, false, false,XSLTAttributeDef.ERROR);
98    XSLTAttributeDef encodingAttr = new XSLTAttributeDef(null, "encoding",
99                                      XSLTAttributeDef.T_CDATA, false, false,XSLTAttributeDef.ERROR);
100    XSLTAttributeDef omitXmlDeclarationAttr = new XSLTAttributeDef(null,
101                                                "omit-xml-declaration",
102                                                XSLTAttributeDef.T_YESNO,
103                                                false, false,XSLTAttributeDef.ERROR);
104    XSLTAttributeDef standaloneAttr = new XSLTAttributeDef(null,
105                                        "standalone",
106                                        XSLTAttributeDef.T_YESNO, false, false,XSLTAttributeDef.ERROR);
107    XSLTAttributeDef doctypePublicAttr = new XSLTAttributeDef(null,
108                                           "doctype-public",
109                                           XSLTAttributeDef.T_CDATA, false, false,XSLTAttributeDef.ERROR);
110    XSLTAttributeDef doctypeSystemAttr = new XSLTAttributeDef(null,
111                                           "doctype-system",
112                                           XSLTAttributeDef.T_CDATA, false, false,XSLTAttributeDef.ERROR);
113    XSLTAttributeDef cdataSectionElementsAttr = new XSLTAttributeDef(null,
114                                                  "cdata-section-elements",
115                                                  XSLTAttributeDef.T_QNAMES_RESOLVE_NULL,
116                                                  false, false,XSLTAttributeDef.ERROR);
117    XSLTAttributeDef indentAttr = new XSLTAttributeDef(null, "indent",
118                                    XSLTAttributeDef.T_YESNO, false, false,XSLTAttributeDef.ERROR);
119    XSLTAttributeDef mediaTypeAttr = new XSLTAttributeDef(null, "media-type",
120                                       XSLTAttributeDef.T_CDATA, false, false,XSLTAttributeDef.ERROR);
121
122
123    // Required.
124    // It is an error if the name attribute is invalid on any of these elements
125    // xsl:key, xsl:attribute-set, xsl:call-template, xsl:with-param, xsl:variable, xsl:param
126    XSLTAttributeDef nameAttrRequired = new XSLTAttributeDef(null, "name",
127                                          XSLTAttributeDef.T_QNAME, true, false,XSLTAttributeDef.ERROR);
128	// Required.
129    // Support AVT
130    // xsl:element, xsl:attribute
131    XSLTAttributeDef nameAVTRequired = new XSLTAttributeDef(null, "name",
132                                         XSLTAttributeDef.T_AVT_QNAME, true, true,XSLTAttributeDef.WARNING);
133
134
135    // Required.
136    // Support AVT
137    // xsl:processing-instruction
138    XSLTAttributeDef nameAVT_NCNAMERequired = new XSLTAttributeDef(null, "name",
139                                         XSLTAttributeDef.T_NCNAME, true, true,XSLTAttributeDef.WARNING);
140
141    // Optional.
142    // Static error if invalid
143    // xsl:template, xsl:decimal-format
144    XSLTAttributeDef nameAttrOpt_ERROR = new XSLTAttributeDef(null, "name",
145                                     XSLTAttributeDef.T_QNAME, false, false,XSLTAttributeDef.ERROR);
146
147    // xsl:key
148    XSLTAttributeDef useAttr = new XSLTAttributeDef(null, "use",
149                                 XSLTAttributeDef.T_EXPR, true, false,XSLTAttributeDef.ERROR);
150
151    // xsl:element, xsl:attribute
152    XSLTAttributeDef namespaceAVTOpt = new XSLTAttributeDef(null,
153                                         "namespace",XSLTAttributeDef.T_URL,
154                                         false, true,XSLTAttributeDef.WARNING);
155    // xsl:decimal-format
156    XSLTAttributeDef decimalSeparatorAttr = new XSLTAttributeDef(null,
157                                              "decimal-separator",
158                                              XSLTAttributeDef.T_CHAR, false,XSLTAttributeDef.ERROR, ".");
159    XSLTAttributeDef infinityAttr = new XSLTAttributeDef(null, "infinity",
160                                      XSLTAttributeDef.T_CDATA, false,XSLTAttributeDef.ERROR,"Infinity");
161    XSLTAttributeDef minusSignAttr = new XSLTAttributeDef(null, "minus-sign",
162                                       XSLTAttributeDef.T_CHAR, false,XSLTAttributeDef.ERROR,"-");
163    XSLTAttributeDef NaNAttr = new XSLTAttributeDef(null, "NaN",
164                                 XSLTAttributeDef.T_CDATA, false,XSLTAttributeDef.ERROR, "NaN");
165    XSLTAttributeDef percentAttr = new XSLTAttributeDef(null, "percent",
166                                     XSLTAttributeDef.T_CHAR, false,XSLTAttributeDef.ERROR, "%");
167    XSLTAttributeDef perMilleAttr = new XSLTAttributeDef(null, "per-mille",
168                                      XSLTAttributeDef.T_CHAR,
169                                      false, false,XSLTAttributeDef.ERROR /* ,"&#x2030;" */);
170    XSLTAttributeDef zeroDigitAttr = new XSLTAttributeDef(null, "zero-digit",
171                                       XSLTAttributeDef.T_CHAR, false,XSLTAttributeDef.ERROR, "0");
172    XSLTAttributeDef digitAttr = new XSLTAttributeDef(null, "digit",
173                                   XSLTAttributeDef.T_CHAR, false,XSLTAttributeDef.ERROR, "#");
174    XSLTAttributeDef patternSeparatorAttr = new XSLTAttributeDef(null,
175                                              "pattern-separator",
176                                              XSLTAttributeDef.T_CHAR, false,XSLTAttributeDef.ERROR, ";");
177    // xsl:decimal-format
178    XSLTAttributeDef groupingSeparatorAttr = new XSLTAttributeDef(null,
179                                               "grouping-separator",
180                                               XSLTAttributeDef.T_CHAR, false,XSLTAttributeDef.ERROR,",");
181
182
183    // xsl:element, xsl:attribute-set, xsl:copy
184    XSLTAttributeDef useAttributeSetsAttr = new XSLTAttributeDef(null,
185                                              "use-attribute-sets",
186                                              XSLTAttributeDef.T_QNAMES,
187                                              false, false, XSLTAttributeDef.ERROR);
188
189    // xsl:if, xsl:when
190    XSLTAttributeDef testAttrRequired = new XSLTAttributeDef(null, "test",
191                                          XSLTAttributeDef.T_EXPR, true, false,XSLTAttributeDef.ERROR);
192
193
194    // Required.
195    // xsl:value-of, xsl:for-each, xsl:copy-of
196    XSLTAttributeDef selectAttrRequired = new XSLTAttributeDef(null,
197                                            "select",
198                                            XSLTAttributeDef.T_EXPR, true, false,XSLTAttributeDef.ERROR);
199
200    // Optional.
201    // xsl:variable, xsl:param, xsl:with-param
202    XSLTAttributeDef selectAttrOpt = new XSLTAttributeDef(null, "select",
203                                       XSLTAttributeDef.T_EXPR, false, false,XSLTAttributeDef.ERROR);
204
205    // Optional.
206    // Default: "node()"
207    // xsl:apply-templates
208    XSLTAttributeDef selectAttrDefNode = new XSLTAttributeDef(null, "select",
209                                           XSLTAttributeDef.T_EXPR, false,XSLTAttributeDef.ERROR, "node()");
210    // Optional.
211    // Default: "."
212    // xsl:sort
213    XSLTAttributeDef selectAttrDefDot = new XSLTAttributeDef(null, "select",
214                                          XSLTAttributeDef.T_EXPR, false,XSLTAttributeDef.ERROR, ".");
215    // xsl:key
216    XSLTAttributeDef matchAttrRequired = new XSLTAttributeDef(null, "match",
217                                           XSLTAttributeDef.T_PATTERN, true, false,XSLTAttributeDef.ERROR);
218    // xsl:template
219    XSLTAttributeDef matchAttrOpt = new XSLTAttributeDef(null, "match",
220                                      XSLTAttributeDef.T_PATTERN, false, false,XSLTAttributeDef.ERROR);
221    // xsl:template
222    XSLTAttributeDef priorityAttr = new XSLTAttributeDef(null, "priority",
223                                     XSLTAttributeDef.T_NUMBER, false, false,XSLTAttributeDef.ERROR);
224
225    // xsl:template, xsl:apply-templates
226    XSLTAttributeDef modeAttr = new XSLTAttributeDef(null, "mode",
227                                     XSLTAttributeDef.T_QNAME, false, false,XSLTAttributeDef.ERROR);
228
229    XSLTAttributeDef spaceAttr =
230      new XSLTAttributeDef(Constants.S_XMLNAMESPACEURI, "space", false, false, false, XSLTAttributeDef.WARNING,
231                           "default", Constants.ATTRVAL_STRIP, "preserve",
232                           Constants.ATTRVAL_PRESERVE);
233
234
235    XSLTAttributeDef spaceAttrLiteral =
236      new XSLTAttributeDef(Constants.S_XMLNAMESPACEURI, "space",
237                                          XSLTAttributeDef.T_URL, false, true,XSLTAttributeDef.ERROR);
238    // xsl:namespace-alias
239    XSLTAttributeDef stylesheetPrefixAttr = new XSLTAttributeDef(null,
240                                              "stylesheet-prefix",
241                                              XSLTAttributeDef.T_CDATA, true, false,XSLTAttributeDef.ERROR);
242    XSLTAttributeDef resultPrefixAttr = new XSLTAttributeDef(null,
243                                          "result-prefix",
244                                          XSLTAttributeDef.T_CDATA, true, false,XSLTAttributeDef.ERROR);
245
246    // xsl:text, xsl:value-of
247    XSLTAttributeDef disableOutputEscapingAttr = new XSLTAttributeDef(null,
248                                                   "disable-output-escaping",
249                                                   XSLTAttributeDef.T_YESNO,
250                                                   false, false,XSLTAttributeDef.ERROR);
251
252	// xsl:number
253    XSLTAttributeDef levelAttr = new XSLTAttributeDef(null, "level", false, false, false, XSLTAttributeDef.ERROR,
254                                   "single", Constants.NUMBERLEVEL_SINGLE,
255                                   "multiple", Constants.NUMBERLEVEL_MULTI,
256                                   "any", Constants.NUMBERLEVEL_ANY);
257    levelAttr.setDefault("single");
258    XSLTAttributeDef countAttr = new XSLTAttributeDef(null, "count",
259                                   XSLTAttributeDef.T_PATTERN, false, false,XSLTAttributeDef.ERROR);
260    XSLTAttributeDef fromAttr = new XSLTAttributeDef(null, "from",
261                                  XSLTAttributeDef.T_PATTERN, false, false,XSLTAttributeDef.ERROR);
262    XSLTAttributeDef valueAttr = new XSLTAttributeDef(null, "value",
263                                   XSLTAttributeDef.T_EXPR, false, false,XSLTAttributeDef.ERROR);
264    XSLTAttributeDef formatAttr = new XSLTAttributeDef(null, "format",
265                                    XSLTAttributeDef.T_CDATA, false, true,XSLTAttributeDef.ERROR);
266    formatAttr.setDefault("1");
267
268    // xsl:number, xsl:sort
269    XSLTAttributeDef langAttr = new XSLTAttributeDef(null, "lang",
270                                  XSLTAttributeDef.T_NMTOKEN, false, true,XSLTAttributeDef.ERROR);
271
272    // xsl:number
273    XSLTAttributeDef letterValueAttr = new XSLTAttributeDef(null,
274                                         "letter-value",
275                                         false, true, false, XSLTAttributeDef.ERROR,
276                                         "alphabetic", Constants.NUMBERLETTER_ALPHABETIC,
277                                         "traditional", Constants.NUMBERLETTER_TRADITIONAL);
278    // xsl:number
279    XSLTAttributeDef groupingSeparatorAVT = new XSLTAttributeDef(null,
280                                              "grouping-separator",
281                                              XSLTAttributeDef.T_CHAR, false, true,XSLTAttributeDef.ERROR);
282    // xsl:number
283    XSLTAttributeDef groupingSizeAttr = new XSLTAttributeDef(null,
284                                          "grouping-size",
285                                          XSLTAttributeDef.T_NUMBER, false, true,XSLTAttributeDef.ERROR);
286
287   // xsl:sort
288    XSLTAttributeDef dataTypeAttr = new XSLTAttributeDef(null, "data-type", false, true, true, XSLTAttributeDef.ERROR,
289                                    "text", Constants.SORTDATATYPE_TEXT ,"number", Constants.SORTDATATYPE_TEXT);
290	dataTypeAttr.setDefault("text");
291
292	// xsl:sort
293    XSLTAttributeDef orderAttr = new XSLTAttributeDef(null, "order", false, true, false,XSLTAttributeDef.ERROR,
294                                    "ascending", Constants.SORTORDER_ASCENDING,
295                                    "descending", Constants.SORTORDER_DESCENDING);
296    orderAttr.setDefault("ascending");
297
298    // xsl:sort
299    XSLTAttributeDef caseOrderAttr = new XSLTAttributeDef(null, "case-order", false, true, false,XSLTAttributeDef.ERROR,
300                                       "upper-first", Constants.SORTCASEORDER_UPPERFIRST ,
301                                       "lower-first", Constants.SORTCASEORDER_LOWERFIRST);
302
303    // xsl:message
304    XSLTAttributeDef terminateAttr = new XSLTAttributeDef(null, "terminate",
305                                       XSLTAttributeDef.T_YESNO, false, false,XSLTAttributeDef.ERROR);
306    terminateAttr.setDefault("no");
307
308	// top level attributes
309    XSLTAttributeDef xslExcludeResultPrefixesAttr =
310      new XSLTAttributeDef(Constants.S_XSLNAMESPACEURL,
311                           "exclude-result-prefixes",
312                           XSLTAttributeDef.T_PREFIXLIST, false, false,XSLTAttributeDef.ERROR);
313    XSLTAttributeDef xslExtensionElementPrefixesAttr =
314      new XSLTAttributeDef(Constants.S_XSLNAMESPACEURL,
315                           "extension-element-prefixes",
316                           XSLTAttributeDef.T_PREFIX_URLLIST, false, false,XSLTAttributeDef.ERROR);
317    // result-element-atts
318    XSLTAttributeDef xslUseAttributeSetsAttr =
319      new XSLTAttributeDef(Constants.S_XSLNAMESPACEURL, "use-attribute-sets",
320                           XSLTAttributeDef.T_QNAMES, false, false,XSLTAttributeDef.ERROR);
321    XSLTAttributeDef xslVersionAttr =
322      new XSLTAttributeDef(Constants.S_XSLNAMESPACEURL, "version",
323                           XSLTAttributeDef.T_NMTOKEN, false, false,XSLTAttributeDef.ERROR);
324
325    XSLTElementDef charData = new XSLTElementDef(this, null, "text()",
326                                null /*alias */, null /* elements */, null,  /* attributes */
327                                new ProcessorCharacters(),
328                                ElemTextLiteral.class /* class object */);
329
330    charData.setType(XSLTElementDef.T_PCDATA);
331
332    XSLTElementDef whiteSpaceOnly = new XSLTElementDef(this, null, "text()",
333                                      null /*alias */, null /* elements */,
334                                      null,  /* attributes */
335                                      null,
336                                      ElemTextLiteral.class /* should be null? -sb */);
337
338    charData.setType(XSLTElementDef.T_PCDATA);
339
340    XSLTAttributeDef resultAttr = new XSLTAttributeDef(null, "*",
341                                    XSLTAttributeDef.T_AVT, false, true,XSLTAttributeDef.WARNING);
342    XSLTAttributeDef xslResultAttr =
343      new XSLTAttributeDef(Constants.S_XSLNAMESPACEURL, "*",
344                           XSLTAttributeDef.T_CDATA, false, false,XSLTAttributeDef.WARNING);
345
346    XSLTElementDef[] templateElements = new XSLTElementDef[23];
347    XSLTElementDef[] templateElementsAndParams = new XSLTElementDef[24];
348    XSLTElementDef[] templateElementsAndSort = new XSLTElementDef[24];
349    //exslt
350    XSLTElementDef[] exsltFunctionElements = new XSLTElementDef[24];
351
352    XSLTElementDef[] charTemplateElements = new XSLTElementDef[15];
353    XSLTElementDef resultElement = new XSLTElementDef(this, null, "*",
354                                     null /*alias */,
355                                     templateElements /* elements */,
356                                     new XSLTAttributeDef[]{
357                                       spaceAttrLiteral, // special
358                                       xslExcludeResultPrefixesAttr,
359                                       xslExtensionElementPrefixesAttr,
360                                       xslUseAttributeSetsAttr,
361                                       xslVersionAttr,
362                                       xslResultAttr,
363                                       resultAttr },
364                                        new ProcessorLRE(),
365                                     ElemLiteralResult.class /* class object */, 20, true);
366    XSLTElementDef unknownElement =
367      new XSLTElementDef(this, "*", "unknown", null /*alias */,
368                         templateElementsAndParams /* elements */,
369                         new XSLTAttributeDef[]{ xslExcludeResultPrefixesAttr,
370                                                 xslExtensionElementPrefixesAttr,
371                                                 xslUseAttributeSetsAttr,
372                                                 xslVersionAttr,
373                                                 xslResultAttr,
374                                                 resultAttr },
375                                                                                                 new ProcessorUnknown(),
376                         ElemUnknown.class /* class object */, 20, true);
377    XSLTElementDef xslValueOf = new XSLTElementDef(this,
378                                  Constants.S_XSLNAMESPACEURL, "value-of",
379                                  null /*alias */, null /* elements */,
380                                  new XSLTAttributeDef[]{ selectAttrRequired,
381                                                          disableOutputEscapingAttr },
382                                               new ProcessorTemplateElem(),
383                                  ElemValueOf.class /* class object */, 20, true);
384    XSLTElementDef xslCopyOf = new XSLTElementDef(this,
385                                 Constants.S_XSLNAMESPACEURL, "copy-of",
386                                 null /*alias */, null /* elements */,
387                                 new XSLTAttributeDef[]{ selectAttrRequired },
388                                 new ProcessorTemplateElem(),
389                                 ElemCopyOf.class /* class object */, 20, true);
390    XSLTElementDef xslNumber = new XSLTElementDef(this,
391                                 Constants.S_XSLNAMESPACEURL, "number",
392                                 null /*alias */, null /* elements */,
393                                 new XSLTAttributeDef[]{ levelAttr,
394                                                         countAttr,
395                                                         fromAttr,
396                                                         valueAttr,
397                                                         formatAttr,
398                                                         langAttr,
399                                                         letterValueAttr,
400                                                         groupingSeparatorAVT,
401                                                         groupingSizeAttr },
402                                        new ProcessorTemplateElem(),
403                                 ElemNumber.class /* class object */, 20, true);
404
405    // <!-- xsl:sort cannot occur after any other elements or
406    // any non-whitespace character -->
407    XSLTElementDef xslSort = new XSLTElementDef(this,
408                                                Constants.S_XSLNAMESPACEURL,
409                                                "sort", null /*alias */,
410                                                null /* elements */,
411                                                new XSLTAttributeDef[]{
412                                                  selectAttrDefDot,
413                                                  langAttr,
414                                                  dataTypeAttr,
415                                                  orderAttr,
416                                                  caseOrderAttr },
417                                       new ProcessorTemplateElem(),
418                                                ElemSort.class/* class object */, 19, true );
419    XSLTElementDef xslWithParam = new XSLTElementDef(this,
420                                    Constants.S_XSLNAMESPACEURL,
421                                    "with-param", null /*alias */,
422                                    templateElements /* elements */,  // %template;>
423                                    new XSLTAttributeDef[]{ nameAttrRequired,
424                                                            selectAttrOpt }, new ProcessorTemplateElem(),
425                                                                             ElemWithParam.class /* class object */, 19, true);
426    XSLTElementDef xslApplyTemplates = new XSLTElementDef(this,
427                                         Constants.S_XSLNAMESPACEURL,
428                                         "apply-templates", null /*alias */,
429                                         new XSLTElementDef[]{ xslSort,
430                                                               xslWithParam } /* elements */, new XSLTAttributeDef[]{
431                                                                 selectAttrDefNode,
432                                                                 modeAttr },
433                                                                        new ProcessorTemplateElem(),
434                                         ElemApplyTemplates.class /* class object */, 20, true);
435    XSLTElementDef xslApplyImports =
436      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "apply-imports",
437                         null /*alias */, null /* elements */,
438                         new XSLTAttributeDef[]{},
439                         new ProcessorTemplateElem(),
440                         ElemApplyImport.class /* class object */);
441    XSLTElementDef xslForEach = new XSLTElementDef(this,
442                                  Constants.S_XSLNAMESPACEURL, "for-each",
443                                  null /*alias */, templateElementsAndSort,  // (#PCDATA %instructions; %result-elements; | xsl:sort)*
444                                  new XSLTAttributeDef[]{ selectAttrRequired,
445                                                          spaceAttr },
446                                               new ProcessorTemplateElem(),
447                                  ElemForEach.class /* class object */, true, false, true, 20, true);
448    XSLTElementDef xslIf = new XSLTElementDef(this,
449                                              Constants.S_XSLNAMESPACEURL,
450                                              "if", null /*alias */,
451                                              templateElements /* elements */,  // %template;
452                                              new XSLTAttributeDef[]{
453                                                testAttrRequired,
454                                                spaceAttr }, new ProcessorTemplateElem(),
455                                                             ElemIf.class /* class object */, 20, true);
456    XSLTElementDef xslWhen =
457      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "when",
458                         null /*alias */, templateElements /* elements */,  // %template;>
459                                                new XSLTAttributeDef[]{
460                                                  testAttrRequired,
461                                                  spaceAttr }, new ProcessorTemplateElem(),
462                                                               ElemWhen.class /* class object */,
463                                                                                                false, true, 1, true);
464    XSLTElementDef xslOtherwise = new XSLTElementDef(this,
465                                    Constants.S_XSLNAMESPACEURL, "otherwise",
466                                    null /*alias */,
467                                    templateElements /* elements */,  // %template;>
468                                    new XSLTAttributeDef[]{ spaceAttr },
469                                    new ProcessorTemplateElem(),
470                                    ElemOtherwise.class /* class object */,
471                                                       false, false, 2, false);
472    XSLTElementDef xslChoose = new XSLTElementDef(this,
473                                 Constants.S_XSLNAMESPACEURL, "choose",
474                                 null /*alias */,
475                                 new XSLTElementDef[]{ xslWhen,
476                                                       xslOtherwise } /* elements */,
477                                        new XSLTAttributeDef[]{ spaceAttr },
478                                 new ProcessorTemplateElem(),
479                                 ElemChoose.class /* class object */, true, false, true, 20, true);
480    XSLTElementDef xslAttribute = new XSLTElementDef(this,
481                                    Constants.S_XSLNAMESPACEURL, "attribute",
482                                    null /*alias */,
483                                    charTemplateElements /* elements */,  // %char-template;>
484                                    new XSLTAttributeDef[]{ nameAVTRequired,
485                                                            namespaceAVTOpt,
486                                                            spaceAttr },
487                                    new ProcessorTemplateElem(),
488                                    ElemAttribute.class /* class object */, 20, true);
489    XSLTElementDef xslCallTemplate =
490      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "call-template",
491                         null /*alias */,
492                         new XSLTElementDef[]{ xslWithParam } /* elements */,
493                         new XSLTAttributeDef[]{ nameAttrRequired },
494                         new ProcessorTemplateElem(),
495                         ElemCallTemplate.class /* class object */, 20, true);
496    XSLTElementDef xslVariable = new XSLTElementDef(this,
497                                   Constants.S_XSLNAMESPACEURL, "variable",
498                                   null /*alias */,
499                                   templateElements /* elements */,  // %template;>
500                                   new XSLTAttributeDef[]{ nameAttrRequired,
501                                                           selectAttrOpt },
502                                  new ProcessorTemplateElem(),
503                                   ElemVariable.class /* class object */, 20, true);
504    XSLTElementDef xslParam = new XSLTElementDef(this,
505                                Constants.S_XSLNAMESPACEURL, "param",
506                                null /*alias */,
507                                templateElements /* elements */,  // %template;>
508                                new XSLTAttributeDef[]{ nameAttrRequired,
509                                                        selectAttrOpt },
510                                       new ProcessorTemplateElem(),
511                                ElemParam.class /* class object */, 19, true);
512    XSLTElementDef xslText =
513      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "text",
514                         null /*alias */,
515                         new XSLTElementDef[]{ charData } /* elements */,
516                         new XSLTAttributeDef[]{ disableOutputEscapingAttr },
517                         new ProcessorText(),
518                         ElemText.class /* class object */, 20, true);
519    XSLTElementDef xslProcessingInstruction =
520      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL,
521                         "processing-instruction", null /*alias */,
522                         charTemplateElements /* elements */,  // %char-template;>
523                         new XSLTAttributeDef[]{
524                                                  nameAVT_NCNAMERequired,
525                                                  spaceAttr },
526                                        new ProcessorTemplateElem(),
527                          ElemPI.class /* class object */, 20, true);
528    XSLTElementDef xslElement = new XSLTElementDef(this,
529                                  Constants.S_XSLNAMESPACEURL, "element",
530                                  null /*alias */,
531                                  templateElements /* elements */,  // %template;
532                                  new XSLTAttributeDef[]{ nameAVTRequired,
533                                                          namespaceAVTOpt,
534                                                          useAttributeSetsAttr,
535                                                          spaceAttr },
536                                               new ProcessorTemplateElem(),
537                                  ElemElement.class /* class object */, 20, true);
538    XSLTElementDef xslComment = new XSLTElementDef(this,
539                                  Constants.S_XSLNAMESPACEURL, "comment",
540                                  null /*alias */,
541                                  charTemplateElements /* elements */,  // %char-template;>
542                                  new XSLTAttributeDef[]{ spaceAttr },
543                                  new ProcessorTemplateElem(),
544                                  ElemComment.class /* class object */, 20, true);
545    XSLTElementDef xslCopy =
546      new XSLTElementDef(this, Constants.S_XSLNAMESPACEURL, "copy",
547                         null /*alias */, templateElements /* elements */,  // %template;>
548                          new XSLTAttributeDef[]{
549                                                  spaceAttr,
550                                                  useAttributeSetsAttr },
551                                        new ProcessorTemplateElem(),
552                          ElemCopy.class /* class object */, 20, true);
553    XSLTElementDef xslMessage = new XSLTElementDef(this,
554                                  Constants.S_XSLNAMESPACEURL, "message",
555                                  null /*alias */,
556                                  templateElements /* elements */,  // %template;>
557                                  new XSLTAttributeDef[]{ terminateAttr },
558                                  new ProcessorTemplateElem(),
559                                  ElemMessage.class /* class object */, 20, true);
560    XSLTElementDef xslFallback = new XSLTElementDef(this,
561                                   Constants.S_XSLNAMESPACEURL, "fallback",
562                                   null /*alias */,
563                                   templateElements /* elements */,  // %template;>
564                                   new XSLTAttributeDef[]{ spaceAttr },
565                                   new ProcessorTemplateElem(),
566                                   ElemFallback.class /* class object */, 20, true);
567    //exslt
568    XSLTElementDef exsltFunction =
569                                  new XSLTElementDef(this,
570                                  Constants.S_EXSLT_FUNCTIONS_URL,
571                                  "function",
572                                  null /*alias */,
573                                  exsltFunctionElements /* elements */,
574                                  new XSLTAttributeDef[]{ nameAttrRequired },
575                                  new ProcessorExsltFunction(),
576                                  ElemExsltFunction.class /* class object */);
577    XSLTElementDef exsltResult =
578                                  new XSLTElementDef(this,
579                                  Constants.S_EXSLT_FUNCTIONS_URL,
580                                  "result",
581                                  null /*alias */,
582                                  templateElements /* elements */,
583                                  new XSLTAttributeDef[]{ selectAttrOpt },
584                                  new ProcessorExsltFuncResult(),
585                                  ElemExsltFuncResult.class  /* class object */);
586
587
588    int i = 0;
589
590    templateElements[i++] = charData;  // #PCDATA
591
592    // char-instructions
593    templateElements[i++] = xslApplyTemplates;
594    templateElements[i++] = xslCallTemplate;
595    templateElements[i++] = xslApplyImports;
596    templateElements[i++] = xslForEach;
597    templateElements[i++] = xslValueOf;
598    templateElements[i++] = xslCopyOf;
599    templateElements[i++] = xslNumber;
600    templateElements[i++] = xslChoose;
601    templateElements[i++] = xslIf;
602    templateElements[i++] = xslText;
603    templateElements[i++] = xslCopy;
604    templateElements[i++] = xslVariable;
605    templateElements[i++] = xslMessage;
606    templateElements[i++] = xslFallback;
607
608    // instructions
609    templateElements[i++] = xslProcessingInstruction;
610    templateElements[i++] = xslComment;
611    templateElements[i++] = xslElement;
612    templateElements[i++] = xslAttribute;
613    templateElements[i++] = resultElement;
614    templateElements[i++] = unknownElement;
615    templateElements[i++] = exsltFunction;
616    templateElements[i++] = exsltResult;
617
618    System.arraycopy(templateElements, 0, templateElementsAndParams, 0, i);
619    System.arraycopy(templateElements, 0, templateElementsAndSort, 0, i);
620    System.arraycopy(templateElements, 0, exsltFunctionElements, 0, i);
621
622    templateElementsAndParams[i] = xslParam;
623    templateElementsAndSort[i] = xslSort;
624    exsltFunctionElements[i]   = xslParam;
625
626    i = 0;
627    charTemplateElements[i++] = charData;  // #PCDATA
628
629    // char-instructions
630    charTemplateElements[i++] = xslApplyTemplates;
631    charTemplateElements[i++] = xslCallTemplate;
632    charTemplateElements[i++] = xslApplyImports;
633    charTemplateElements[i++] = xslForEach;
634    charTemplateElements[i++] = xslValueOf;
635    charTemplateElements[i++] = xslCopyOf;
636    charTemplateElements[i++] = xslNumber;
637    charTemplateElements[i++] = xslChoose;
638    charTemplateElements[i++] = xslIf;
639    charTemplateElements[i++] = xslText;
640    charTemplateElements[i++] = xslCopy;
641    charTemplateElements[i++] = xslVariable;
642    charTemplateElements[i++] = xslMessage;
643    charTemplateElements[i++] = xslFallback;
644
645    XSLTElementDef importDef = new XSLTElementDef(this,
646                                 Constants.S_XSLNAMESPACEURL, "import",
647                                 null /*alias */, null /* elements */,
648                                 new XSLTAttributeDef[]{ hrefAttr },  // EMPTY
649                                 new ProcessorImport(),
650                                 null /* class object */,
651                                        1, true);
652    XSLTElementDef includeDef = new XSLTElementDef(this,
653                                  Constants.S_XSLNAMESPACEURL, "include",
654                                  null /*alias */, null /* elements */,  // EMPTY
655                                  new XSLTAttributeDef[]{ hrefAttr },
656                                  new ProcessorInclude(),
657                                  null /* class object */,
658                                               20, true);
659
660    XSLTAttributeDef[] scriptAttrs = new XSLTAttributeDef[]{
661    					    new XSLTAttributeDef(null, "lang", XSLTAttributeDef.T_NMTOKEN,
662                                                                 true, false,XSLTAttributeDef.WARNING),
663                                            new XSLTAttributeDef(null, "src", XSLTAttributeDef.T_URL,
664                                            			 false, false,XSLTAttributeDef.WARNING)};
665
666    XSLTAttributeDef[] componentAttrs = new XSLTAttributeDef[]{
667                                            new XSLTAttributeDef(null, "prefix", XSLTAttributeDef.T_NMTOKEN,
668                                            			 true, false,XSLTAttributeDef.WARNING),
669                                            new XSLTAttributeDef(null, "elements", XSLTAttributeDef.T_STRINGLIST,
670                                            			 false, false,XSLTAttributeDef.WARNING),
671                                            new XSLTAttributeDef(null, "functions", XSLTAttributeDef.T_STRINGLIST,
672                                            			 false, false,XSLTAttributeDef.WARNING) };
673
674    XSLTElementDef[] topLevelElements = new XSLTElementDef[]
675                                 {includeDef,
676                                  importDef,
677                                  // resultElement,
678                                  whiteSpaceOnly,
679                                  unknownElement,
680                                  new XSLTElementDef(
681                                         this,
682                                         Constants.S_XSLNAMESPACEURL,
683                                         "strip-space",
684                                         null /*alias */,
685                                         null /* elements */,
686                                         new XSLTAttributeDef[]{
687                                                elementsAttr },
688                                                new ProcessorStripSpace(),
689                                         null /* class object */, 20, true),
690                                  new XSLTElementDef(
691                                         this,
692                                         Constants.S_XSLNAMESPACEURL,
693                                         "preserve-space",
694                                         null /*alias */,
695                                         null /* elements */,
696                                         new XSLTAttributeDef[]{
697                                                 elementsAttr },
698                                                 new ProcessorPreserveSpace(),
699                                         null /* class object */, 20, true),
700                                  new XSLTElementDef(
701                                         this,
702                                         Constants.S_XSLNAMESPACEURL,
703                                         "output",
704                                         null /*alias */,
705                                         null /* elements */,
706                                         new XSLTAttributeDef[]{
707                                                  methodAttr,
708                                                  versionAttr,
709                                                  encodingAttr,
710                                                  omitXmlDeclarationAttr,
711                                                  standaloneAttr,
712                                                  doctypePublicAttr,
713                                                  doctypeSystemAttr,
714                                                  cdataSectionElementsAttr,
715                                                  indentAttr,
716                                                  mediaTypeAttr,
717                                                  XSLTAttributeDef.m_foreignAttr },
718                                          new ProcessorOutputElem(), null /* class object */, 20, true),
719                                  new XSLTElementDef(
720                                          this,
721                                          Constants.S_XSLNAMESPACEURL,
722                                          "key",
723                                          null /*alias */,
724                                          null /* elements */,  // EMPTY
725                                          new XSLTAttributeDef[]{ nameAttrRequired,
726                                                  matchAttrRequired,
727                                                  useAttr },
728                                          new ProcessorKey(), null /* class object */, 20, true),
729                                  new XSLTElementDef(
730                                          this,
731                                          Constants.S_XSLNAMESPACEURL,
732                                          "decimal-format",
733                                          null /*alias */,
734                                          null /* elements */,  // EMPTY
735                                          new XSLTAttributeDef[]{
736                                                  nameAttrOpt_ERROR,
737                                                  decimalSeparatorAttr,
738                                                  groupingSeparatorAttr,
739                                                  infinityAttr,
740                                                  minusSignAttr,
741                                                  NaNAttr,
742                                                  percentAttr,
743                                                  perMilleAttr,
744                                                  zeroDigitAttr,
745                                                  digitAttr,
746                                                  patternSeparatorAttr },
747                                           new ProcessorDecimalFormat(),
748                                           null /* class object */, 20, true),
749                                  new XSLTElementDef(
750                                           this,
751                                           Constants.S_XSLNAMESPACEURL,
752                                           "attribute-set",
753                                           null /*alias */,
754                                           new XSLTElementDef[]{
755                                                   xslAttribute } /* elements */,
756                                           new XSLTAttributeDef[]{
757                                                   nameAttrRequired,
758                                                   useAttributeSetsAttr },
759                                           new ProcessorAttributeSet(),
760                                           null /* class object */, 20, true),
761                                  new XSLTElementDef(
762                                           this,
763                                           Constants.S_XSLNAMESPACEURL,
764                                           "variable",
765                                           null /*alias */,
766                                           templateElements /* elements */,
767                                           new XSLTAttributeDef[]{
768                                                   nameAttrRequired,
769                                                   selectAttrOpt },
770                                           new ProcessorGlobalVariableDecl(),
771                                           ElemVariable.class /* class object */, 20, true),
772                                  new XSLTElementDef(
773                                           this,
774                                           Constants.S_XSLNAMESPACEURL,
775                                           "param",
776                                           null /*alias */,
777                                           templateElements /* elements */,
778                                           new XSLTAttributeDef[]{
779                                                   nameAttrRequired,
780                                                   selectAttrOpt },
781                                           new ProcessorGlobalParamDecl(),
782                                           ElemParam.class /* class object */, 20, true),
783                                  new XSLTElementDef(
784                                           this,
785                                           Constants.S_XSLNAMESPACEURL,
786                                           "template",
787                                           null /*alias */,
788                                           templateElementsAndParams /* elements */,
789                                           new XSLTAttributeDef[]{
790                                                   matchAttrOpt,
791                                                   nameAttrOpt_ERROR,
792                                                   priorityAttr,
793                                                   modeAttr,
794                                                   spaceAttr },
795                                           new ProcessorTemplate(), ElemTemplate.class /* class object */, true, 20, true),
796                                  new XSLTElementDef(
797                                           this,
798                                           Constants.S_XSLNAMESPACEURL,
799                                           "namespace-alias",
800                                           null /*alias */,
801                                          null /* elements */,  // EMPTY
802                                           new XSLTAttributeDef[]{
803                                                   stylesheetPrefixAttr,
804                                                   resultPrefixAttr },
805                                           new ProcessorNamespaceAlias(), null /* class object */, 20, true),
806                                  new XSLTElementDef(
807                                           this,
808                                           Constants.S_BUILTIN_EXTENSIONS_URL,
809                                           "component",
810                                           null /*alias */,
811                                           new XSLTElementDef[]{
812                                                    new XSLTElementDef(
813                                                        this,
814                                                        Constants.S_BUILTIN_EXTENSIONS_URL,
815                                                        "script",
816                                                        null /*alias */,
817                                                    	new XSLTElementDef[]{
818                                                        charData } /* elements */,
819                                                        scriptAttrs,
820                                                        new ProcessorLRE(),
821                                                        ElemExtensionScript.class /* class object */, 20, true) },  // EMPTY
822                                           componentAttrs,
823                                           new ProcessorLRE(), ElemExtensionDecl.class /* class object */),
824                                  new XSLTElementDef(
825                                           this,
826                                           Constants.S_BUILTIN_OLD_EXTENSIONS_URL,
827                                           "component",
828                                           null /*alias */,
829                                           new XSLTElementDef[]{
830                                                    new XSLTElementDef(
831                                                        this,
832                                                        Constants.S_BUILTIN_OLD_EXTENSIONS_URL,
833                                                        "script",
834                                                        null /*alias */,
835                                                    	new XSLTElementDef[]{
836                                                        charData } /* elements */,
837                                                        scriptAttrs,
838                                                        new ProcessorLRE(),
839                                                        ElemExtensionScript.class /* class object */, 20, true) },  // EMPTY
840                                           componentAttrs,
841                                           new ProcessorLRE(), ElemExtensionDecl.class /* class object */),
842                                  exsltFunction}/* exslt */;  //end of topevelElements
843
844    XSLTAttributeDef excludeResultPrefixesAttr =
845      new XSLTAttributeDef(null, "exclude-result-prefixes",
846                           XSLTAttributeDef.T_PREFIXLIST, false,false,XSLTAttributeDef.WARNING);
847    XSLTAttributeDef extensionElementPrefixesAttr =
848      new XSLTAttributeDef(null, "extension-element-prefixes",
849                           XSLTAttributeDef.T_PREFIX_URLLIST, false,false,XSLTAttributeDef.WARNING);
850    XSLTAttributeDef idAttr = new XSLTAttributeDef(null, "id",
851                                XSLTAttributeDef.T_CDATA, false,false,XSLTAttributeDef.WARNING);
852    XSLTAttributeDef versionAttrRequired = new XSLTAttributeDef(null,
853                                             "version",
854                                             XSLTAttributeDef.T_NMTOKEN,
855                                             true,false,XSLTAttributeDef.WARNING);
856    XSLTElementDef stylesheetElemDef = new XSLTElementDef(this,
857                                         Constants.S_XSLNAMESPACEURL,
858                                         "stylesheet", "transform",
859                                         topLevelElements,
860                                         new XSLTAttributeDef[]{
861                                           extensionElementPrefixesAttr,
862                                           excludeResultPrefixesAttr,
863                                           idAttr,
864                                           versionAttrRequired,
865                                           spaceAttr }, new ProcessorStylesheetElement(),  /* ContentHandler */
866                                         null  /* class object */,
867                                         true, -1, false);
868
869    importDef.setElements(new XSLTElementDef[]{ stylesheetElemDef,
870                                                resultElement,
871                                                unknownElement });
872    includeDef.setElements(new XSLTElementDef[]{ stylesheetElemDef,
873                                                 resultElement,
874                                                 unknownElement });
875    build(null, null, null, new XSLTElementDef[]{ stylesheetElemDef,
876                                                  whiteSpaceOnly,
877                                                  resultElement,
878                                                  unknownElement }, null,
879                                                                    new ProcessorStylesheetDoc(),  /* ContentHandler */
880                                                                    null  /* class object */
881                                                                      );
882  }
883
884  /**
885   * A hashtable of all available built-in elements for use by the element-available
886   * function.
887   * TODO:  When we convert to Java2, this should be a Set.
888   */
889  private HashMap m_availElems = new HashMap();
890
891  /**
892   * Get the table of available elements.
893   *
894   * @return table of available elements, keyed by qualified names, and with
895   * values of the same qualified names.
896   */
897  public HashMap getElemsAvailable()
898  {
899    return m_availElems;
900  }
901
902  /**
903   * Adds a new element name to the Hashtable of available elements.
904   * @param elemName The name of the element to add to the Hashtable of available elements.
905   */
906  void addAvailableElement(QName elemName)
907  {
908    m_availElems.put(elemName, elemName);
909  }
910
911  /**
912   * Determines whether the passed element name is present in the list of available elements.
913   * @param elemName The name of the element to look up.
914   *
915   * @return true if an element corresponding to elemName is available.
916   */
917  public boolean elementAvailable(QName elemName)
918  {
919    return m_availElems.containsKey(elemName);
920  }
921}
922
923