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  */
21 package org.apache.xalan.processor;
22 
23 import java.util.HashMap;
24 
25 import org.apache.xalan.templates.Constants;
26 import org.apache.xalan.templates.ElemApplyImport;
27 import org.apache.xalan.templates.ElemApplyTemplates;
28 import org.apache.xalan.templates.ElemAttribute;
29 import org.apache.xalan.templates.ElemCallTemplate;
30 import org.apache.xalan.templates.ElemChoose;
31 import org.apache.xalan.templates.ElemComment;
32 import org.apache.xalan.templates.ElemCopy;
33 import org.apache.xalan.templates.ElemCopyOf;
34 import org.apache.xalan.templates.ElemElement;
35 import org.apache.xalan.templates.ElemExsltFuncResult;
36 import org.apache.xalan.templates.ElemExsltFunction;
37 import org.apache.xalan.templates.ElemExtensionDecl;
38 import org.apache.xalan.templates.ElemExtensionScript;
39 import org.apache.xalan.templates.ElemFallback;
40 import org.apache.xalan.templates.ElemForEach;
41 import org.apache.xalan.templates.ElemIf;
42 import org.apache.xalan.templates.ElemLiteralResult;
43 import org.apache.xalan.templates.ElemMessage;
44 import org.apache.xalan.templates.ElemNumber;
45 import org.apache.xalan.templates.ElemOtherwise;
46 import org.apache.xalan.templates.ElemPI;
47 import org.apache.xalan.templates.ElemParam;
48 import org.apache.xalan.templates.ElemSort;
49 import org.apache.xalan.templates.ElemTemplate;
50 import org.apache.xalan.templates.ElemText;
51 import org.apache.xalan.templates.ElemTextLiteral;
52 import org.apache.xalan.templates.ElemUnknown;
53 import org.apache.xalan.templates.ElemValueOf;
54 import org.apache.xalan.templates.ElemVariable;
55 import org.apache.xalan.templates.ElemWhen;
56 import org.apache.xalan.templates.ElemWithParam;
57 import 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  */
64 public class XSLTSchema extends XSLTElementDef
65 {
66 
67   /**
68    * Construct a XSLTSchema which represents the XSLT "schema".
69    */
XSLTSchema()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    */
build()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    */
getElemsAvailable()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    */
addAvailableElement(QName elemName)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    */
elementAvailable(QName elemName)917   public boolean elementAvailable(QName elemName)
918   {
919     return m_availElems.containsKey(elemName);
920   }
921 }
922 
923