NOTE: This DTD Fragment is not normative because XML 1.0 DTDs do not support XML Namespaces and thus cannot correctly describe the allowed structure of an XSLT stylesheet.
The following entity can be used to construct a DTD for XSLT stylesheets that create instances of a particular result DTD. Before referencing the entity, the stylesheet DTD must define a result-elements parameter entity listing the allowed result element types. For example:
<!ENTITY % result-elements " fo:inline-sequence fo:block ">
Such result elements should be declared to have xsl:use-attribute-sets and xsl:extension-element-prefixes attributes. The following entity declares the result-element-atts parameter for this purpose. The content that XSLT allows for result elements is the same as it allows for the XSLT elements that are declared in the following entity with a content model of %template; . The DTD may use a more restrictive content model than %template; to reflect the constraints of the result DTD.
The DTD may define the non-xsl-top-level parameter entity to allow additional top-level elements from namespaces other than the XSLT namespace.
The use of the xsl: prefix in this DTD does not imply that XSLT stylesheets are required to use this prefix. Any of the elements declared in this DTD may have attributes whose name starts with xmlns: or is equal to xmlns in addition to the attributes declared in this DTD.
<!ENTITY % char-instructions " xsl:apply-templates xsl:call-template xsl:apply-imports xsl:for-each xsl:value-of xsl:copy-of xsl:number xsl:choose xsl:if xsl:text xsl:copy xsl:variable xsl:message xsl:fallback "> <!ENTITY % instructions " %char-instructions; xsl:processing-instruction xsl:comment xsl:element xsl:attribute "> <!ENTITY % char-template " (#PCDATA %char-instructions;)* "> <!ENTITY % template " (#PCDATA %instructions; %result-elements;)* "> <!-- Used for the type of an attribute value that is a URI reference.--> <!ENTITY % URI "CDATA"> <!-- Used for the type of an attribute value that is a pattern.--> <!ENTITY % pattern "CDATA"> <!-- Used for the type of an attribute value that is an attribute value template.--> <!ENTITY % avt "CDATA"> <!-- Used for the type of an attribute value that is a QName; the prefix gets expanded by the XSLT processor. --> <!ENTITY % qname "NMTOKEN"> <!-- Like qname but a whitespace-separated list of QNames. --> <!ENTITY % qnames "NMTOKENS"> <!-- Used for the type of an attribute value that is an expression.--> <!ENTITY % expr "CDATA"> <!-- Used for the type of an attribute value that consists of a single character.--> <!ENTITY % char "CDATA"> <!-- Used for the type of an attribute value that is a priority. --> <!ENTITY % priority "NMTOKEN"> <!ENTITY % space-att "xml:space (defaultpreserve) #IMPLIED"> <!-- This may be overridden to customize the set of elements allowed at the top-level. --> <!ENTITY % non-xsl-top-level ""> <!ENTITY % top-level " (xsl:import*, (xsl:include xsl:strip-space xsl:preserve-space xsl:output xsl:key xsl:decimal-format xsl:attribute-set xsl:variable xsl:param xsl:template xsl:namespace-alias %non-xsl-top-level;)*) "> <!ENTITY % top-level-atts ' extension-element-prefixes CDATA #IMPLIED exclude-result-prefixes CDATA #IMPLIED id ID #IMPLIED version NMTOKEN #REQUIRED xmlns:xsl CDATA #FIXED "http://www.w3.org/1999/XSL/Transform" %space-att; '> <!-- This entity is defined for use in the ATTLIST declaration for result elements. --> <!ENTITY % result-element-atts ' xsl:extension-element-prefixes CDATA #IMPLIED xsl:exclude-result-prefixes CDATA #IMPLIED xsl:use-attribute-sets %qnames; #IMPLIED xsl:version NMTOKEN #IMPLIED '> <!ELEMENT xsl:stylesheet %top-level;> <!ATTLIST xsl:stylesheet %top-level-atts;> <!ELEMENT xsl:transform %top-level;> <!ATTLIST xsl:transform %top-level-atts;> <!ELEMENT xsl:import EMPTY> <!ATTLIST xsl:import href %URI; #REQUIRED> <!ELEMENT xsl:include EMPTY> <!ATTLIST xsl:include href %URI; #REQUIRED> <!ELEMENT xsl:strip-space EMPTY> <!ATTLIST xsl:strip-space elements CDATA #REQUIRED> <!ELEMENT xsl:preserve-space EMPTY> <!ATTLIST xsl:preserve-space elements CDATA #REQUIRED> <!ELEMENT xsl:output EMPTY> <!ATTLIST xsl:output method %qname; #IMPLIED version NMTOKEN #IMPLIED encoding CDATA #IMPLIED omit-xml-declaration (yesno) #IMPLIED standalone (yesno) #IMPLIED doctype-public CDATA #IMPLIED doctype-system CDATA #IMPLIED cdata-section-elements %qnames; #IMPLIED indent (yesno) #IMPLIED media-type CDATA #IMPLIED > <!ELEMENT xsl:key EMPTY> <!ATTLIST xsl:key name %qname; #REQUIRED match %pattern; #REQUIRED use %expr; #REQUIRED > <!ELEMENT xsl:decimal-format EMPTY> <!ATTLIST xsl:decimal-format name %qname; #IMPLIED decimal-separator %char; "." grouping-separator %char; "," infinity CDATA "Infinity" minus-sign %char; "-" NaN CDATA "NaN" percent %char; "%" per-mille %char; "‰" zero-digit %char; "0" digit %char; "#" pattern-separator %char; ";" > <!ELEMENT xsl:namespace-alias EMPTY> <!ATTLIST xsl:namespace-alias stylesheet-prefix CDATA #REQUIRED result-prefix CDATA #REQUIRED > <!ELEMENT xsl:template (#PCDATA %instructions; %result-elements; xsl:param)* > <!ATTLIST xsl:template match %pattern; #IMPLIED name %qname; #IMPLIED priority %priority; #IMPLIED mode %qname; #IMPLIED %space-att; > <!ELEMENT xsl:value-of EMPTY> <!ATTLIST xsl:value-of select %expr; #REQUIRED disable-output-escaping (yesno) "no" > <!ELEMENT xsl:copy-of EMPTY> <!ATTLIST xsl:copy-of select %expr; #REQUIRED> <!ELEMENT xsl:number EMPTY> <!ATTLIST xsl:number level (singlemultipleany) "single" count %pattern; #IMPLIED from %pattern; #IMPLIED value %expr; #IMPLIED format %avt; '1' lang %avt; #IMPLIED letter-value %avt; #IMPLIED grouping-separator %avt; #IMPLIED grouping-size %avt; #IMPLIED > <!ELEMENT xsl:apply-templates (xsl:sort with-param)*> <!ATTLIST xsl:apply-templates select %expr; "node()" mode %qname; #IMPLIED > <!ELEMENT xsl:apply-imports EMPTY> <!-- xsl:sort cannot occur after any other elements or any non-whitespace character --> <!ELEMENT xsl:for-each (#PCDATA %instructions; %result-elements; xsl:sort)* > <!ATTLIST xsl:for-each select %expr; #REQUIRED %space-att; > <!ELEMENT xsl:sort EMPTY> <!ATTLIST xsl:sort select %expr; "." lang %avt; #IMPLIED data-type %avt; "text" order %avt; "ascending" case-order %avt; #IMPLIED > <!ELEMENT xsl:if %template;> <!ATTLIST xsl:if test %expr; #REQUIRED %space-att; > <!ELEMENT xsl:choose (xsl:when+, xsl:otherwise?)> <!ATTLIST xsl:choose %space-att;> <!ELEMENT xsl:when %template;> <!ATTLIST xsl:when test %expr; #REQUIRED %space-att; > <!ELEMENT xsl:otherwise %template;> <!ATTLIST xsl:otherwise %space-att;> <!ELEMENT xsl:attribute-set (xsl:attribute)*> <!ATTLIST xsl:attribute-set name %qname; #REQUIRED use-attribute-sets %qnames; #IMPLIED > <!ELEMENT xsl:call-template (xsl:with-param)*> <!ATTLIST xsl:call-template name %qname; #REQUIRED > <!ELEMENT xsl:with-param %template;> <!ATTLIST xsl:with-param name %qname; #REQUIRED select %expr; #IMPLIED > <!ELEMENT xsl:variable %template;> <!ATTLIST xsl:variable name %qname; #REQUIRED select %expr; #IMPLIED > <!ELEMENT xsl:param %template;> <!ATTLIST xsl:param name %qname; #REQUIRED select %expr; #IMPLIED > <!ELEMENT xsl:text (#PCDATA)> <!ATTLIST xsl:text disable-output-escaping (yesno) "no" > <!ELEMENT xsl:processing-instruction %char-template;> <!ATTLIST xsl:processing-instruction name %avt; #REQUIRED %space-att; > <!ELEMENT xsl:element %template;> <!ATTLIST xsl:element name %avt; #REQUIRED namespace %avt; #IMPLIED use-attribute-sets %qnames; #IMPLIED %space-att; > <!ELEMENT xsl:attribute %char-template;> <!ATTLIST xsl:attribute name %avt; #REQUIRED namespace %avt; #IMPLIED %space-att; > <!ELEMENT xsl:comment %char-template;> <!ATTLIST xsl:comment %space-att;> <!ELEMENT xsl:copy %template;> <!ATTLIST xsl:copy %space-att; use-attribute-sets %qnames; #IMPLIED > <!ELEMENT xsl:message %template;> <!ATTLIST xsl:message %space-att; terminate (yesno) "no" > <!ELEMENT xsl:fallback %template;> <!ATTLIST xsl:fallback %space-att;>