001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the "License");
007 * you may not use this file except in compliance with the License.
008 * You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 /*
019 * $Id: XSLTSchema.java 476466 2006-11-18 08:22:31Z minchau $
020 */
021 package org.apache.xalan.processor;
022
023 import java.util.HashMap;
024
025 import org.apache.xalan.templates.Constants;
026 import org.apache.xalan.templates.ElemApplyImport;
027 import org.apache.xalan.templates.ElemApplyTemplates;
028 import org.apache.xalan.templates.ElemAttribute;
029 import org.apache.xalan.templates.ElemCallTemplate;
030 import org.apache.xalan.templates.ElemChoose;
031 import org.apache.xalan.templates.ElemComment;
032 import org.apache.xalan.templates.ElemCopy;
033 import org.apache.xalan.templates.ElemCopyOf;
034 import org.apache.xalan.templates.ElemElement;
035 import org.apache.xalan.templates.ElemExsltFuncResult;
036 import org.apache.xalan.templates.ElemExsltFunction;
037 import org.apache.xalan.templates.ElemExtensionDecl;
038 import org.apache.xalan.templates.ElemExtensionScript;
039 import org.apache.xalan.templates.ElemFallback;
040 import org.apache.xalan.templates.ElemForEach;
041 import org.apache.xalan.templates.ElemIf;
042 import org.apache.xalan.templates.ElemLiteralResult;
043 import org.apache.xalan.templates.ElemMessage;
044 import org.apache.xalan.templates.ElemNumber;
045 import org.apache.xalan.templates.ElemOtherwise;
046 import org.apache.xalan.templates.ElemPI;
047 import org.apache.xalan.templates.ElemParam;
048 import org.apache.xalan.templates.ElemSort;
049 import org.apache.xalan.templates.ElemTemplate;
050 import org.apache.xalan.templates.ElemText;
051 import org.apache.xalan.templates.ElemTextLiteral;
052 import org.apache.xalan.templates.ElemUnknown;
053 import org.apache.xalan.templates.ElemValueOf;
054 import org.apache.xalan.templates.ElemVariable;
055 import org.apache.xalan.templates.ElemWhen;
056 import org.apache.xalan.templates.ElemWithParam;
057 import org.apache.xml.utils.QName;
058
059 /**
060 * This class defines the allowed structure for a stylesheet, and the
061 * mapping between Xalan classes and the markup elements in the stylesheet.
062 * @see <a href="http://www.w3.org/TR/xslt#dtd">XSLT DTD</a>
063 */
064 public class XSLTSchema extends XSLTElementDef
065 {
066
067 /**
068 * Construct a XSLTSchema which represents the XSLT "schema".
069 */
070 XSLTSchema()
071 {
072 build();
073 }
074
075 /**
076 * This method builds an XSLT "schema" according to http://www.w3.org/TR/xslt#dtd. This
077 * schema provides instructions for building the Xalan Stylesheet (Templates) structure.
078 */
079 void build()
080 {
081 // xsl:import, xsl:include
082 XSLTAttributeDef hrefAttr = new XSLTAttributeDef(null, "href",
083 XSLTAttributeDef.T_URL, true, false,XSLTAttributeDef.ERROR);
084
085 // xsl:preserve-space, xsl:strip-space
086 XSLTAttributeDef elementsAttr = new XSLTAttributeDef(null, "elements",
087 XSLTAttributeDef.T_SIMPLEPATTERNLIST,
088 true, false, XSLTAttributeDef.ERROR);
089
090 // XSLTAttributeDef anyNamespacedAttr = new XSLTAttributeDef("*", "*",
091 // XSLTAttributeDef.T_CDATA, false);
092
093 // xsl:output
094 XSLTAttributeDef methodAttr = new XSLTAttributeDef(null, "method",
095 XSLTAttributeDef.T_QNAME, false, false,XSLTAttributeDef.ERROR);
096 XSLTAttributeDef versionAttr = new XSLTAttributeDef(null, "version",
097 XSLTAttributeDef.T_NMTOKEN, false, false,XSLTAttributeDef.ERROR);
098 XSLTAttributeDef encodingAttr = new XSLTAttributeDef(null, "encoding",
099 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 /* ,"‰" */);
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