B Schema for Serialization Parameters

The following schema describes the structure of a Data Model instance that can be used to specify the settings of serialization parameters using the mechanism described in 3.1 Setting Serialization Parameters by Means of a Data Model Instance.

A copy of this schema is available at http://www.w3.org/2017/01/xslt-xquery-serialization/schema-for-serialization-parameters.xsd.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.w3.org/2010/xslt-xquery-serialization"
    xmlns:output="http://www.w3.org/2010/xslt-xquery-serialization"
    elementFormDefault="qualified">

  <xs:annotation>
    <xs:documentation>
      This is a schema for serialization parameters for XSLT and
      XQuery Serialization 3.1.

      This schema is available for use under the conditions of the
      W3C Software License published at
      http://www.w3.org/Consortium/Legal/copyright-software-19980720
      
      It defines a schema for XML Infoset instances with which a
      user of a host language MAY specify serialization parameters
      for use in serializing an instance of the XQuery and XPath
      Data Model.  It also provides hooks that allow the inclusion
      of implementation- defined serialization parameters and
      implementation-defined modifiers to serialization parameters.
    </xs:documentation>
  </xs:annotation>

  <xs:simpleType name="EQName">
    <!--* In principle, this could be declared as a single-step
        * restriction of xs:token with the pattern
        * "Q\{(.*)\}[\i-[:]][\c-[:]]*".  We derive it in two
        * steps because a bug causes some widely used processors 
        * not to support character-class subtraction.
        *-->
    <xs:restriction>
      <xs:simpleType>
        <xs:restriction base="xs:token">
          <xs:pattern value="Q\{[^{}]*\}[\i][\c]*"/>
          <xs:whiteSpace value="collapse"/>
        </xs:restriction>
      </xs:simpleType>
      <xs:pattern value="Q\{.*\}[^:]*"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="Prefixed-QName">
    <xs:annotation>
      <xs:documentation>
        Prefixed-QName matches only QNames with a non-null prefix:  
        that is, only QNames with a colon.
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:QName">
      <xs:pattern value=".*:.*"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="Qualified-EQName">
    <xs:annotation>
      <xs:documentation>
        Qualified-EQName matches only EQNames with a non-null namespace name.
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="output:EQName">
      <xs:pattern value=".*\{(.*\S.*)\}.*"/>
    </xs:restriction>    
  </xs:simpleType>
  
  <xs:simpleType name="QName-or-EQName">
    <xs:union memberTypes="xs:QName output:EQName"/> 
  </xs:simpleType>   
  
  <xs:simpleType name="QNames-type">
    <xs:list itemType="output:QName-or-EQName"/>
  </xs:simpleType>

  <xs:simpleType name="yes-no-type">
    <xs:restriction base="xs:token">
      <xs:enumeration value="no"/>
      <xs:enumeration value="yes"/>
      <xs:enumeration value="false"/>
      <xs:enumeration value="true"/>
      <xs:enumeration value="0"/>
      <xs:enumeration value="1"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="yes-no-omit-type">
    <xs:restriction base="xs:token">
      <xs:enumeration value="no"/>
      <xs:enumeration value="omit"/>
      <xs:enumeration value="yes"/>
      <xs:enumeration value="false"/>
      <xs:enumeration value="true"/>
      <xs:enumeration value="0"/>
      <xs:enumeration value="1"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="char-type">
    <xs:restriction base="xs:string">
      <xs:maxLength value="1"/>
      <xs:minLength value="1"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="encoding-string-type">
    <xs:restriction base="xs:token">
      <xs:pattern value="[A-Za-z][A-Za-z0-9._\-]*"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="json-node-output-method-type">
    <xs:union>
      <xs:simpleType>
        <xs:restriction base="xs:token">
          <xs:enumeration value="html"/>
          <xs:enumeration value="text"/>
          <xs:enumeration value="xml"/>
          <xs:enumeration value="xhtml"/>
        </xs:restriction>
      </xs:simpleType>
      <xs:simpleType>
        <xs:restriction base="output:EQName">
          <xs:pattern value="Q\{\s*\}(html|text|xml|xhtml)"/>
        </xs:restriction>
      </xs:simpleType>
      <!--* other values must have non-null namespace URI *-->
      <xs:simpleType>
        <xs:restriction base="output:Prefixed-QName"/>        
      </xs:simpleType>
      <xs:simpleType>
        <xs:restriction base="output:Qualified-EQName"/>        
      </xs:simpleType>
    </xs:union>
  </xs:simpleType>

  <xs:simpleType name="method-type">
    <xs:union>
      <xs:simpleType>
        <xs:restriction base="xs:token">
          <xs:enumeration value="html"/>
          <xs:enumeration value="text"/>
          <xs:enumeration value="xml"/>
          <xs:enumeration value="xhtml"/>
          <xs:enumeration value="json"/>
          <xs:enumeration value="adaptive"/>
        </xs:restriction>
      </xs:simpleType>
      <xs:simpleType>
        <xs:restriction base="output:EQName">
          <xs:pattern value="Q\{\s*\}(html|text|xml|xhtml|json|adaptive)"/>
        </xs:restriction>
      </xs:simpleType>
      <!--* other values must have non-null namespace URI *-->
      <xs:simpleType>
        <xs:restriction base="output:Prefixed-QName"/>        
      </xs:simpleType>
      <xs:simpleType>
        <xs:restriction base="output:Qualified-EQName"/>        
      </xs:simpleType>
    </xs:union>
  </xs:simpleType>

  <xs:simpleType name="pubid-char-string-type">
    <xs:restriction base="xs:token">
      <xs:pattern value="([- \r\n\ta-zA-Z0-9'()+,./:=?;!*#@$_%])*"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="system-id-string-type">
    <xs:restriction base="xs:string">
      <xs:pattern value="[^']*|[^&quot;]*"/>
    </xs:restriction>
  </xs:simpleType>

  <!--
     - Base type of all serialization parameter types
    -->
  <xs:complexType name="base-param-type">
    <xs:complexContent>
      <xs:restriction base="xs:anyType">
        <xs:anyAttribute namespace="##other" 
                         processContents="lax"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>

  <!--
     - Generic string serialization parameters
    -->
  <xs:complexType name="string-param-type">
    <xs:complexContent>
      <xs:extension base="output:base-param-type">
        <xs:attribute name="value" 
                      type="xs:string" 
                      use="required"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  
  <!--
     - Generic tokenized string serialization parameters
    -->
  <xs:complexType name="tokenized-string-param-type">
    <xs:complexContent>
      <xs:extension base="output:base-param-type">
        <xs:attribute name="value" 
          type="xs:token" 
          use="required"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!--
     - Generic decimal serialization parameters
    -->
  <xs:complexType name="decimal-param-type">
    <xs:complexContent>
      <xs:extension base="output:base-param-type">
        <xs:attribute name="value" 
                      type="xs:decimal" 
                      use="required"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!--
     - Serialization parameter type for "yes", "no", "true", "false", "0" or "1"
     - serialization parameters
    -->
  <xs:complexType name="yes-no-param-type">
    <xs:complexContent>
      <xs:extension base="output:base-param-type">
        <xs:attribute name="value" 
                      type="output:yes-no-type" 
                      use="required"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!--
     - Serialization parameter type for list of xs:QName
     - serialization parameters
    -->
  <xs:complexType name="QNames-param-type">
    <xs:complexContent>
      <xs:extension base="output:base-param-type">
        <xs:attribute name="value" 
                      type="output:QNames-type" 
                      use="required"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!--
     - Serialization parameter type for "yes", "no", "true", "false", "0", "1" or "omit"
     - serialization parameters
    -->
  <xs:complexType name="yes-no-omit-param-type">
    <xs:complexContent>
      <xs:extension base="output:base-param-type">
        <xs:attribute name="value" 
                      type="output:yes-no-omit-type"
                      use="required"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!--
     - Serialization parameter type for NMTOKEN serialization
       parameters
    -->
  <xs:complexType name="NMTOKEN-param-type">
    <xs:complexContent>
      <xs:extension base="output:base-param-type">
        <xs:attribute name="value" 
                      type="xs:NMTOKEN" 
                      use="required"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!--
     - Base element declaration for all serialization parameter
       elements
    -->
  <xs:element name="serialization-parameter-element"
              abstract="true"
              type="output:base-param-type"/>

  <!--
     - Serialization parameter element for allow-duplicate-names
       parameter
    -->
  <xs:element id="allow-duplicate-names" 
              name="allow-duplicate-names" 
              type="output:yes-no-param-type"
              substitutionGroup 
              = "output:serialization-parameter-element"/>

  <!--
     - Serialization parameter element for byte-order-mark
       parameter
    -->
  <xs:element id="byte-order-mark" 
              name="byte-order-mark" 
              type="output:yes-no-param-type"
              substitutionGroup 
              = "output:serialization-parameter-element"/>

  <!--
     - Serialization parameter element for cdata-section-elements
       parameter
    -->
  <xs:element id="cdata-section-elements" 
              name="cdata-section-elements" 
              type="output:QNames-param-type"
              substitutionGroup
              = "output:serialization-parameter-element"/>

  <!--
     - Serialization parameter type for doctype-public parameter
    -->
  <xs:complexType name="doctype-public-param-type">
    <xs:complexContent>
      <xs:extension base="output:base-param-type">
        <xs:attribute name="value" 
                      type="output:pubid-char-string-type"
                      use="required"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!--
     - Serialization parameter element for doctype-public parameter
    -->
  <xs:element id="doctype-public" 
              name="doctype-public" 
              type="output:doctype-public-param-type"
              substitutionGroup
              = "output:serialization-parameter-element"/>

  <!--
     - Serialization parameter type for doctype-system parameter
    -->
  <xs:complexType name="doctype-system-param-type">
    <xs:complexContent>
      <xs:extension base="output:base-param-type">
        <xs:attribute name="value" 
                      type="output:system-id-string-type"
                      use="required"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!--
     - Serialization parameter element for doctype-system parameter
    -->
  <xs:element id="doctype-system" 
              name="doctype-system" 
              type="output:doctype-system-param-type"
              substitutionGroup
              = "output:serialization-parameter-element"/>

  <!--
     - Serialization parameter type for encoding parameter
    -->
  <xs:complexType name="encoding-param-type">
    <xs:complexContent>
      <xs:extension base="output:base-param-type">
        <xs:attribute name="value" 
                      type="output:encoding-string-type"
                      use="required"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!--
     - Serialization parameter element for encoding parameter
    -->
  <xs:element id="encoding" 
              name="encoding" 
              type="output:encoding-param-type"
              substitutionGroup
              = "output:serialization-parameter-element"/>

  <!--
     - Serialization parameter element for escape-uri-attributes
       parameter
    -->
  <xs:element id="escape-uri-attributes"
              name="escape-uri-attributes"
              type="output:yes-no-param-type"
              substitutionGroup
              = "output:serialization-parameter-element"/>

  <!--
     - Serialization parameter element for html-version parameter
    -->
  <xs:element id="html-version" 
              name="html-version"
              type="output:decimal-param-type"
              substitutionGroup
              = "output:serialization-parameter-element"/>

  <!--
     - Serialization parameter element for include-content-type
       parameter
    -->
  <xs:element id="include-content-type" 
              name="include-content-type"
              type="output:yes-no-param-type"
              substitutionGroup
              = "output:serialization-parameter-element"/>

  <!--
     - Serialization parameter element for indent parameter
    -->
  <xs:element id="indent" 
              name="indent"
              type="output:yes-no-param-type"
              substitutionGroup
              = "output:serialization-parameter-element"/>

  <!--
     - Serialization parameter element for item-separator 
       parameter
    -->
  <xs:element id="item-separator" 
              name="item-separator"
              type="output:string-param-type"
              substitutionGroup
              = "output:serialization-parameter-element"/>

  <!--
     - Serialization parameter type for json-node-output-method parameter
    -->
  <xs:complexType name="json-node-output-method-param-type">
    <xs:complexContent>
      <xs:extension base="output:base-param-type">
        <xs:attribute name="value" 
                      type="output:json-node-output-method-type"
                      use="required"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!--
     - Serialization parameter element for json-node-output-method parameter
    -->
  <xs:element id="json-node-output-method" 
              name="json-node-output-method" 
              type="output:json-node-output-method-param-type"
              substitutionGroup
              = "output:serialization-parameter-element"/>

  <!--
     - Serialization parameter element for media-type parameter
    -->
  <xs:element id="media-type" 
              name="media-type" 
              type="output:tokenized-string-param-type"
              substitutionGroup
              = "output:serialization-parameter-element"/>

  <!--
     - Serialization parameter type for method parameter
    -->
  <xs:complexType name="method-param-type">
    <xs:complexContent>
      <xs:extension base="output:base-param-type">
        <xs:attribute name="value" 
                      type="output:method-type"
                      use="required"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!--
     - Serialization parameter element for method parameter
    -->
  <xs:element id="method" 
              name="method" 
              type="output:method-param-type"
              substitutionGroup
              = "output:serialization-parameter-element"/>
  <!--
     - Serialization parameter element for normalization-form
       parameter
    -->
  <xs:element id="normalization-form" 
              name="normalization-form" 
              type="output:NMTOKEN-param-type"
              substitutionGroup
              = "output:serialization-parameter-element"/>

  <!--
     - Serialization parameter element for omit-xml-declaration
       parameter
    -->
  <xs:element id="omit-xml-declaration" 
              name="omit-xml-declaration" 
              type="output:yes-no-param-type"
              substitutionGroup
              = "output:serialization-parameter-element"/>

  <!--
     - Serialization parameter element for standalone parameter
    -->
  <xs:element id="standalone" 
              name="standalone" 
              type="output:yes-no-omit-param-type"
              substitutionGroup
              = "output:serialization-parameter-element"/>

  <!--
     - Serialization parameter element for suppress-indentation
       parameter
    -->
  <xs:element id="suppress-indentation" 
              name="suppress-indentation" 
              type="output:QNames-param-type"
              substitutionGroup
              = "output:serialization-parameter-element"/>

  <!--
     - Serialization parameter element for undeclare-prefixes
       parameter
    -->
  <xs:element id="undeclare-prefixes" 
              name="undeclare-prefixes" 
              type="output:yes-no-param-type"
              substitutionGroup
              = "output:serialization-parameter-element"/>

  <!--
     - Serialization parameter type for use-character-maps
       parameter
    -->
  <xs:complexType name="use-character-maps-param-type">
    <xs:complexContent>
      <xs:extension base="output:base-param-type">
        <xs:sequence>
          <xs:element name="character-map" 
                      minOccurs="0"
                      maxOccurs="unbounded">
            <xs:complexType>
              <xs:attribute name="character" 
                            type="output:char-type"/>
              <xs:attribute name="map-string" 
                            type="xs:string"/>
              <xs:anyAttribute namespace="##other"
                               processContents="lax"/>
            </xs:complexType>
          </xs:element>
          <xs:any minOccurs="0" 
                  namespace="##other"
                  processContents="lax"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!--
     - Serialization parameter element for use-character-maps
       parameter
    -->
  <xs:element id="use-character-maps" 
              name="use-character-maps"
              type="output:use-character-maps-param-type"
              substitutionGroup
              = "output:serialization-parameter-element"/>

  <!--
     - Serialization parameter element for version parameter
    -->
  <xs:element id="version" 
              name="version"
              type="output:tokenized-string-param-type"
              substitutionGroup
              = "output:serialization-parameter-element"/>

  <xs:element name="serialization-parameters">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="output:serialization-parameter-element"/>
        <xs:any namespace="##other"
                processContents="lax"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>