<!-- DTD (non-normative) for the W3C XML Processing Model language

     Minimal provision is made for user-defined steps - Users may override the
      definition of the parameter entity user-steps - see below.

     Even less provision is provided for extension elements and
       attributes - users may overrided the definitions of the
       parameter entities extra-elts and extra-attrs, but extra-elts does
       _not_ allow extras anywhere  - see below. 

     Likewise, for documentation, p and div are pre-allowed, others
      can be added via the entity doc-elts -->

<!ENTITY % p 'p:'> <!-- can be overriden in the internal subset of a
                         schema document to establish a different
                         namespace prefix -->
<!ENTITY % s ':p'> <!-- if %p is defined (e.g. as foo:) then you must
                         also define %s as the suffix for the appropriate
                         namespace declaration (e.g. :foo) -->
<!ENTITY % nds 'xmlns%s;'>

<!ENTITY % pipeline "%p;pipeline">
<!ENTITY % input "%p;input">
<!ENTITY % document "%p;document">
<!ENTITY % pipe "%p;pipe">
<!ENTITY % doc "%p;doc">
<!ENTITY % inline "%p;inline">
<!ENTITY % output "%p;output">
<!ENTITY % option "%p;option">
<!ENTITY % parameter "%p;parameter">
<!ENTITY % import-parameter "%p;import-parameter">
<!ENTITY % for-each "%p;for-each">
<!ENTITY % viewport "%p;viewport">
<!ENTITY % choose "%p;choose">
<!ENTITY % when "%p;when">
<!ENTITY % otherwise "%p;otherwise">
<!ENTITY % xpath-context "%p;xpath-context">
<!ENTITY % iteration-source "%p;iteration-source">
<!ENTITY % viewport-source "%p;viewport-source">
<!ENTITY % group "%p;group">
<!ENTITY % try "%p;try">
<!ENTITY % catch "%p;catch">
<!ENTITY % declare-step "%p;declare-step">
<!ENTITY % pipeline-library "%p;pipeline-library">
<!ENTITY % import "%p;import">

<!ENTITY % extension-prefixes "%p;extension-prefixes">

<!ENTITY % delete "%p;delete">
<!ENTITY % http-request "%p;http-request">
<!ENTITY % identity "%p;identity">
<!ENTITY % insert "%p;insert">
<!ENTITY % join-sequences "%p;join-sequences">
<!ENTITY % label-elements "%p;label-elements">
<!ENTITY % load "%p;load">
<!ENTITY % ns-rename "%p;ns-rename">
<!ENTITY % parse "%p;parse">
<!ENTITY % relax-ng-validate "%p;relax-ng-validate">
<!ENTITY % rename "%p;rename">
<!ENTITY % replace "%p;replace">
<!ENTITY % serialise "%p;serialise">
<!ENTITY % set-attributes "%p;set-attributes">
<!ENTITY % store "%p;store">
<!ENTITY % subsequence "%p;subsequence">
<!ENTITY % unwrap "%p;unwrap">
<!ENTITY % wrap "%p;wrap">
<!ENTITY % xinclude "%p;xinclude">
<!ENTITY % xinclude-from-sequence "%p;xinclude-from-sequence">
<!ENTITY % xml-schema-validate "%p;xml-schema-validate">
<!ENTITY % xquery "%p;xquery">
<!ENTITY % xslt "%p;xslt">
<!ENTITY % xslt-2.0 "%p;xslt-2.0">

<!ENTITY % user-steps "">
<!ENTITY % extra-attrs "">
<!ENTITY % extra-elts "">
<!ENTITY % doc-elts "">

<!ENTITY % step "(%delete;|%http-request;|%identity;|%insert;|
                  %join-sequences;|%label-elements;|%load;|%ns-rename;|
                  %parse;|%relax-ng-validate;|%rename;|%replace;|%serialise;|
                  %set-attributes;|%store;|%subsequence;|%unwrap;|%wrap;|%xinclude;|
                  %xinclude-from-sequence;|%xml-schema-validate;|%xquery;|%xslt;|
                  %xslt-2.0; %user-steps;)">
<!ENTITY % component
 "(%step;|%group;|%viewport;|%for-each;|%choose;|%try; %extra-elts;)">
<!ENTITY % subpipeline
 "(%component; , (%component; | %doc;)* )?">
<!ENTITY % binding
 "(%document;|%pipe;|%inline;|%doc; %extra-elts;)">

<!ENTITY % NCName "NMTOKEN">
<!ENTITY % QName "NMTOKEN">
<!ENTITY % URIref "CDATA">
<!ENTITY % XPath_expression "CDATA">
<!ENTITY % port_name "%NCName;">
<!ENTITY % step_name "%NCName;">
<!ENTITY % string "CDATA">
<!ENTITY % param-spec "CDATA">

<!ENTITY % global-attrs
  "xml:id NMTOKEN #IMPLIED
   xml:base %URIref; #IMPLIED
   %extension-prefixes; NMTOKENS #IMPLIED
   %extra-attrs;" >

<!ENTITY % step-model
 "((%input;)|
   (%option;) | 
   (%import-parameter;) |
   (%parameter;) |
   (%doc;) %extra-elts;)*">
<!ENTITY % step-attrs
 "name %NCName; #IMPLIED
  %global-attrs;" >

<!-- this is provided solely
      for the use of user-defined compound steps -->
<!ENTITY % compound-step-model
  "(((%input;) |
   (%output;) |
   (%option;) |
   (%import-parameter;) |
   (%parameter;) |
   (%doc;) %extra-elts; )*
   %subpipeline;)">

<!ELEMENT %pipeline; 
   (((%input;) |
    (%output;) |
    (%parameter;) |
    (%import;) |
    (%declare-step;) |
    (%doc;) %extra-elts;)*,
    %subpipeline;)>
<!ATTLIST %pipeline;
  name %NCName; #IMPLIED
  %global-attrs;
  %nds; %URIref; #FIXED 'http://www.w3.org/2007/03/xproc'
 >

<!ELEMENT %input; (%binding;)*>
<!ATTLIST %input;  
  %global-attrs;
  port %NCName; #REQUIRED
  sequence (yes|no)  'no'
  select %XPath_expression;  #IMPLIED>

<!ELEMENT %pipe; (%doc;)?>
<!ATTLIST %pipe;
  %global-attrs;
  step %step_name; #REQUIRED
  port %port_name; #REQUIRED>

<!ELEMENT %document; (%doc;)?>
<!ATTLIST %document;
  %global-attrs;
  href %URIref; #REQUIRED>

<!ELEMENT %inline; ANY>
<!ATTLIST %inline; %global-attrs;>

<!ELEMENT %output; 
   (%binding;)*>
<!ATTLIST %output;  
  %global-attrs;
  port %NCName; #REQUIRED
  sequence (yes|no)  'no'
  default (yes|no) 'no'>

<!ELEMENT %parameter; 
   (%binding;)?>
<!ATTLIST %parameter;  
  %global-attrs;
  name %param-spec; #REQUIRED
  required (yes|no) 'no'
  value %string; #IMPLIED
  select %XPath_expression;  #IMPLIED
 >

<!ELEMENT %option;
   (%binding;)?>
<!ATTLIST %option;  
  %global-attrs;
  name %param-spec; #REQUIRED
  required (yes|no) 'no'
  value %string; #IMPLIED
  select %XPath_expression;  #IMPLIED
 >

<!ELEMENT %import-parameter; (%doc;)?>
<!ATTLIST %import-parameter;  
  %global-attrs;
  name %param-spec; #REQUIRED
 >

<!ELEMENT %for-each; 
   ((%iteration-source;)?,
    ((%output;) |
    (%parameter;) |
    (%doc;) )*,
    %subpipeline;)>
<!ATTLIST %for-each; 
  %step-attrs;
  select %XPath_expression;  #IMPLIED
 >


<!ELEMENT %iteration-source; (%binding;)*>
<!ATTLIST %iteration-source;  
  %global-attrs;
  select %XPath_expression;  #IMPLIED>

<!ELEMENT %viewport; 
   ((%viewport-source;)?,
    %output;,
    ((%parameter;) | (%doc;))*,
    %subpipeline;)>
<!ATTLIST %viewport; 
  %step-attrs;
  match %XPath_expression;  #REQUIRED
 >

<!ELEMENT %viewport-source; (%binding;)>
<!ATTLIST %viewport-source;  
  %global-attrs;>

<!ELEMENT %choose; 
   ((%xpath-context;)?,
    (%when;)*,
    (%otherwise;)?)>
<!ATTLIST %choose; 
  %step-attrs;
 >

<!ELEMENT %when; 
   ((%xpath-context;)?,
    ((%output;) |
    (%parameter;) |
    (%doc;) )*,
    %subpipeline;)>
<!ATTLIST %when; 
  %global-attrs;
  test %XPath_expression; #REQUIRED
 >

<!ELEMENT %otherwise; 
   (((%output;) |
    (%parameter;) |
    (%doc;) )*,
    %subpipeline;)>
<!ATTLIST %otherwise;
  %global-attrs; >

<!ELEMENT %xpath-context;
   %binding;>
<!ATTLIST %xpath-context;
  %global-attrs;>

<!ELEMENT %group; 
   (((%output;) |
    (%parameter;) |
    (%doc;) )*,
    %subpipeline;)>
<!ATTLIST %group; 
  %step-attrs;
 >

<!ELEMENT %try; 
   (%group;,
    %catch;)>
<!ATTLIST %try; 
  %step-attrs;
 >

<!ELEMENT %catch; 
   (((%output;) |
    (%parameter;) |
    (%doc;) )*,
    %subpipeline;)>
<!ATTLIST %catch; 
  %step-attrs;
 >

<!ELEMENT %identity; %step-model;>
<!ATTLIST %identity; %step-attrs;>
<!ELEMENT %join-sequences; %step-model;>
<!ATTLIST %join-sequences; %step-attrs;>
<!ELEMENT %load; %step-model;>
<!ATTLIST %load; %step-attrs;>
<!ELEMENT %store; %step-model;>
<!ATTLIST %store; %step-attrs;>
<!ELEMENT %subsequence; %step-model;>
<!ATTLIST %subsequence; %step-attrs;>
<!ELEMENT %xinclude; %step-model;>
<!ATTLIST %xinclude; %step-attrs;>
<!ELEMENT %xslt; %step-model;>
<!ATTLIST %xslt; %step-attrs;>
<!ELEMENT %serialise; %step-model;>
<!ATTLIST %serialise; %step-attrs;>
<!ELEMENT %parse; %step-model;>
<!ATTLIST %parse; %step-attrs;>

<!ELEMENT %http-request; %step-model;>
<!ATTLIST %http-request; %step-attrs;>
<!ELEMENT %relax-ng-validate; %step-model;>
<!ATTLIST %relax-ng-validate; %step-attrs;>
<!ELEMENT %xinclude-from-sequence; %step-model;>
<!ATTLIST %xinclude-from-sequence; %step-attrs;>
<!ELEMENT %xml-schema-validate; %step-model;>
<!ATTLIST %xml-schema-validate; %step-attrs;>
<!ELEMENT %xslt-2.0; %step-model;>
<!ATTLIST %xslt-2.0; %step-attrs;>
<!ELEMENT %xquery; %step-model;>
<!ATTLIST %xquery; %step-attrs;>

<!ELEMENT %delete; %step-model;>
<!ATTLIST %delete; %step-attrs;>
<!ELEMENT %insert; %step-model;>
<!ATTLIST %insert; %step-attrs;>
<!ELEMENT %label-elements; %step-model;>
<!ATTLIST %label-elements; %step-attrs;>
<!ELEMENT %ns-rename; %step-model;>
<!ATTLIST %ns-rename; %step-attrs;>
<!ELEMENT %rename; %step-model;>
<!ATTLIST %rename; %step-attrs;>
<!ELEMENT %replace; %step-model;>
<!ATTLIST %replace; %step-attrs;>
<!ELEMENT %set-attributes; %step-model;>
<!ATTLIST %set-attributes; %step-attrs;>
<!ELEMENT %unwrap; %step-model;>
<!ATTLIST %unwrap; %step-attrs;>
<!ELEMENT %wrap; %step-model;>
<!ATTLIST %wrap; %step-attrs;>

<!ELEMENT %declare-step; 
   ((%input;) |
    (%output;) |
    (%option;) |
    (%parameter;) |
    (%doc;) %extra-elts;)*>
<!ATTLIST %declare-step; 
  %global-attrs;
  type %QName; #REQUIRED
 >

<!ELEMENT %pipeline-library; 
   ((%import;) |
    (%declare-step;) |
    (%pipeline;) |
    (%doc;) %extra-elts;)*>
<!ATTLIST %pipeline-library;
  %global-attrs;
  %extension-prefixes; NMTOKENS #IMPLIED
  %nds; %URIref; #FIXED 'http://www.w3.org/2007/03/xproc'
  namespace %URIref; #IMPLIED>

<!ELEMENT %import; (%doc;)?>
<!ATTLIST %import;
  %global-attrs;
  href %URIref; #REQUIRED
 >

<!ELEMENT %doc; (p | div %doc-elts;)*>
<!ATTLIST %doc;
  %global-attrs;>
