<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns:html="http://www.w3.org/1999/xhtml" xmlns:sa="http://xproc.org/ns/syntax-annotations" xmlns:c="http://www.w3.org/2007/03/xproc-step" xmlns:err="http://www.w3.org/2007/03/xproc-error" xmlns:p="http://www.w3.org/2007/03/xproc" xmlns:s="http://www.ascc.net/xml/schematron" ns="http://www.w3.org/2007/03/xproc" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes">
  <!--
    This schema incorrectly prohibits xml:id and xml:base on extension
    elements and the contents of p:documentation. They are allowed in those places.
  -->
  <define name="XPathExpression" sa:model="XPath expression">
    <text/>
  </define>
  <define name="name.attr">
    <attribute name="name">
      <data type="NCName"/>
    </attribute>
  </define>
  <define name="port.attr">
    <attribute name="port">
      <data type="NCName"/>
    </attribute>
  </define>
  <define name="required.attr">
    <attribute name="required">
      <choice>
        <value>yes</value>
        <value>no</value>
      </choice>
    </attribute>
  </define>
  <define name="sequence.attr">
    <attribute name="sequence">
      <choice>
        <value>yes</value>
        <value>no</value>
      </choice>
    </attribute>
  </define>
  <define name="primary.attr">
    <attribute name="primary">
      <choice>
        <value>yes</value>
        <value>no</value>
      </choice>
    </attribute>
  </define>
  <define name="select.attr">
    <attribute name="select">
      <ref name="XPathExpression"/>
    </attribute>
  </define>
  <define name="ignore-prefixes.attr">
    <attribute name="ignore-prefixes">
      <ref name="PrefixList"/>
    </attribute>
  </define>
  <define name="PrefixList" sa:model="prefix list">
    <data type="NMTOKENS"/>
  </define>
  <define name="xmlid.attr" sa:ignore="yes">
    <attribute name="xml:id">
      <data type="ID"/>
    </attribute>
  </define>
  <define name="xmlbase.attr" sa:ignore="yes">
    <attribute name="xml:base">
      <data type="anyURI"/>
    </attribute>
  </define>
  <define name="href.attr">
    <attribute name="href">
      <data type="anyURI"/>
    </attribute>
  </define>
  <define name="common.attributes">
    <optional>
      <ref name="xmlid.attr"/>
    </optional>
    <optional>
      <ref name="xmlbase.attr"/>
    </optional>
  </define>
  <!-- ============================================================ -->
  <start>
    <choice>
      <ref name="Pipeline"/>
      <ref name="PipelineLibrary"/>
      <ref name="VocabParameter"/>
      <ref name="VocabParameterList"/>
      <ref name="VocabResult"/>
      <ref name="VocabHttpRequest"/>
      <ref name="VocabHeader"/>
      <ref name="VocabMultipart"/>
      <ref name="VocabBody"/>
      <ref name="VocabHttpResponse"/>
      <ref name="VocabQuery"/>
      <ref name="Errors"/>
    </choice>
  </start>
  <!-- ============================================================ -->
  <define name="PipelineLibrary" sa:class="language-construct">
    <element name="pipeline-library">
      <optional>
        <attribute name="namespace">
          <data type="anyURI"/>
        </attribute>
      </optional>
      <optional>
        <ref name="ignore-prefixes.attr"/>
      </optional>
      <ref name="common.attributes"/>
      <zeroOrMore>
        <choice>
          <ref name="Import"/>
          <ref name="DeclareStep"/>
          <ref name="Pipeline"/>
          <ref name="Documentation"/>
        </choice>
      </zeroOrMore>
    </element>
  </define>
  <define name="Import" sa:class="language-construct">
    <element name="import">
      <ref name="common.attributes"/>
      <ref name="href.attr"/>
      <zeroOrMore>
        <ref name="Documentation"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="Pipeline" sa:class="language-construct">
    <element name="pipeline">
      <optional>
        <attribute name="name">
          <data type="NCName"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="type">
          <data type="QName"/>
        </attribute>
      </optional>
      <optional>
        <ref name="ignore-prefixes.attr"/>
      </optional>
      <ref name="common.attributes"/>
      <zeroOrMore>
        <choice>
          <ref name="Input"/>
          <ref name="ParameterInput"/>
          <ref name="Output"/>
          <ref name="Option"/>
          <ref name="Import"/>
          <ref name="DeclareStep"/>
          <ref name="Log"/>
          <ref name="Documentation"/>
        </choice>
      </zeroOrMore>
      <ref name="Subpipeline"/>
    </element>
  </define>
  <define name="Subpipeline" sa:model="subpipeline">
    <zeroOrMore>
      <choice>
        <ref name="ForEach"/>
        <ref name="Viewport"/>
        <ref name="Choose"/>
        <ref name="Group"/>
        <ref name="Try"/>
        <ref name="OtherStep"/>
        <ref name="Documentation"/>
        <ref name="Ignored"/>
      </choice>
    </zeroOrMore>
  </define>
  <!-- ============================================================ -->
  <define name="InputDeclaration" sa:class="language-construct">
    <element name="input">
      <ref name="port.attr"/>
      <optional>
        <ref name="sequence.attr"/>
      </optional>
      <optional>
        <ref name="primary.attr"/>
      </optional>
      <optional>
        <attribute name="kind">
          <value>document</value>
        </attribute>
      </optional>
      <ref name="common.attributes"/>
      <empty/>
    </element>
  </define>
  <define name="InputBinding" sa:class="language-construct">
    <element name="input">
      <ref name="port.attr"/>
      <optional>
        <ref name="sequence.attr"/>
      </optional>
      <optional>
        <ref name="primary.attr"/>
      </optional>
      <optional>
        <ref name="select.attr"/>
      </optional>
      <ref name="common.attributes"/>
      <interleave>
        <optional>
          <choice>
            <ref name="Empty"/>
            <oneOrMore>
              <choice>
                <ref name="Pipe"/>
                <ref name="Document"/>
                <ref name="Inline"/>
              </choice>
            </oneOrMore>
          </choice>
        </optional>
        <zeroOrMore>
          <ref name="Documentation"/>
        </zeroOrMore>
      </interleave>
    </element>
  </define>
  <define name="Input" sa:element="input">
    <choice>
      <ref name="InputDeclaration"/>
      <ref name="InputBinding"/>
    </choice>
  </define>
  <!-- ============================================================ -->
  <define name="ParameterInputDeclaration" sa:class="language-construct">
    <element name="input">
      <ref name="port.attr"/>
      <optional>
        <attribute name="sequence">
          <value>yes</value>
        </attribute>
      </optional>
      <attribute name="kind">
        <value>parameter</value>
      </attribute>
      <ref name="common.attributes"/>
      <empty/>
    </element>
  </define>
  <define name="ParameterInput" sa:element="input" sa:ignore="yes">
    <ref name="ParameterInputDeclaration"/>
  </define>
  <!-- ============================================================ -->
  <define name="OutputDeclaration" sa:class="language-construct">
    <element name="output">
      <ref name="port.attr"/>
      <optional>
        <ref name="sequence.attr"/>
      </optional>
      <optional>
        <ref name="primary.attr"/>
      </optional>
      <ref name="common.attributes"/>
      <empty/>
    </element>
  </define>
  <define name="OutputBinding" sa:class="language-construct">
    <element name="output">
      <ref name="port.attr"/>
      <optional>
        <ref name="sequence.attr"/>
      </optional>
      <optional>
        <ref name="primary.attr"/>
      </optional>
      <ref name="common.attributes"/>
      <interleave>
        <optional>
          <choice>
            <ref name="Empty"/>
            <oneOrMore>
              <choice>
                <ref name="Pipe"/>
                <ref name="Document"/>
                <ref name="Inline"/>
              </choice>
            </oneOrMore>
          </choice>
        </optional>
        <zeroOrMore>
          <ref name="Documentation"/>
        </zeroOrMore>
      </interleave>
    </element>
  </define>
  <define name="Output" sa:element="output">
    <choice>
      <ref name="OutputDeclaration"/>
      <ref name="OutputBinding"/>
    </choice>
  </define>
  <define name="Pipe" sa:class="language-construct">
    <element name="pipe">
      <attribute name="step">
        <data type="NCName"/>
      </attribute>
      <ref name="port.attr"/>
      <ref name="common.attributes"/>
      <zeroOrMore>
        <ref name="Documentation"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="Document" sa:class="language-construct">
    <element name="document">
      <ref name="href.attr"/>
      <ref name="common.attributes"/>
      <zeroOrMore>
        <ref name="Documentation"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="Inline" sa:class="language-construct">
    <element name="inline">
      <ref name="common.attributes"/>
      <ref name="Any"/>
    </element>
  </define>
  <define name="Empty" sa:class="language-construct">
    <element name="empty">
      <empty/>
    </element>
  </define>
  <define name="Log" sa:class="language-construct">
    <element name="log">
      <ref name="common.attributes"/>
      <ref name="port.attr"/>
      <ref name="href.attr"/>
      <empty/>
    </element>
  </define>
  <!-- ============================================================ -->
  <define name="OptionDeclaration" sa:class="language-construct">
    <element name="option">
      <attribute name="name">
        <data type="QName"/>
      </attribute>
      <optional>
        <ref name="required.attr"/>
      </optional>
      <empty/>
    </element>
  </define>
  <define name="OptionValue" sa:class="language-construct">
    <element name="option">
      <attribute name="name">
        <data type="QName"/>
      </attribute>
      <attribute name="value"/>
      <optional>
        <ref name="required.attr"/>
      </optional>
      <ref name="common.attributes"/>
      <zeroOrMore>
        <ref name="Documentation"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="OptionSelect" sa:class="language-construct">
    <element name="option">
      <attribute name="name">
        <data type="QName"/>
      </attribute>
      <ref name="select.attr"/>
      <optional>
        <ref name="required.attr"/>
      </optional>
      <ref name="common.attributes"/>
      <interleave>
        <optional>
          <choice>
            <ref name="Empty"/>
            <ref name="Pipe"/>
            <ref name="Document"/>
            <ref name="Inline"/>
          </choice>
        </optional>
        <zeroOrMore>
          <ref name="Documentation"/>
        </zeroOrMore>
      </interleave>
    </element>
  </define>
  <define name="Option" sa:element="option">
    <choice>
      <ref name="OptionDeclaration"/>
      <ref name="OptionValue"/>
      <ref name="OptionSelect"/>
    </choice>
  </define>
  <!-- ============================================================ -->
  <!--
    ParameterSet =
      element parameter-set {
         common.attributes,
         attribute name { xsd:NCName },
         (Pipe|Document|Inline|Parameter|UseParameterSet)*
      }
  -->
  <!--
    UseParameterSet =
      element use-parameter-set {
         common.attributes,
         attribute name { xsd:NCName },
         empty
      }
  -->
  <define name="ParameterValue" sa:class="language-construct">
    <element name="parameter">
      <attribute name="name">
        <data type="QName"/>
      </attribute>
      <attribute name="value"/>
      <ref name="common.attributes"/>
      <zeroOrMore>
        <ref name="Documentation"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="ParameterSelect" sa:class="language-construct">
    <element name="parameter">
      <attribute name="name">
        <data type="QName"/>
      </attribute>
      <ref name="select.attr"/>
      <ref name="common.attributes"/>
      <interleave>
        <optional>
          <choice>
            <ref name="Empty"/>
            <ref name="Pipe"/>
            <ref name="Document"/>
            <ref name="Inline"/>
          </choice>
        </optional>
        <zeroOrMore>
          <ref name="Documentation"/>
        </zeroOrMore>
      </interleave>
    </element>
  </define>
  <define name="Parameter" sa:element="parameter">
    <choice>
      <ref name="ParameterValue"/>
      <ref name="ParameterSelect"/>
    </choice>
  </define>
  <!-- ============================================================ -->
  <define name="ImportParameter" sa:class="language-construct">
    <element name="import-parameter">
      <attribute name="name">
        <choice>
          <data type="QName"/>
          <value>*</value>
          <data type="token">
            <param name="pattern">\*:.+</param>
          </data>
          <data type="token">
            <param name="pattern">.+:\*</param>
          </data>
        </choice>
      </attribute>
      <ref name="common.attributes"/>
      <zeroOrMore>
        <ref name="Documentation"/>
      </zeroOrMore>
    </element>
  </define>
  <!-- ============================================================ -->
  <define name="DeclareStep" sa:class="language-construct">
    <element name="declare-step">
      <attribute name="type">
        <data type="QName"/>
      </attribute>
      <ref name="common.attributes"/>
      <zeroOrMore>
        <choice>
          <ref name="Input"/>
          <ref name="ParameterInput"/>
          <ref name="Output"/>
          <ref name="Option"/>
          <ref name="Documentation"/>
        </choice>
      </zeroOrMore>
    </element>
  </define>
  <!-- ============================================================ -->
  <define name="ForEach" sa:class="language-construct">
    <element name="for-each">
      <optional>
        <ref name="name.attr"/>
      </optional>
      <ref name="common.attributes"/>
      <group>
        <zeroOrMore>
          <ref name="Documentation"/>
        </zeroOrMore>
        <optional>
          <ref name="IterationSource"/>
        </optional>
        <zeroOrMore>
          <choice>
            <ref name="Output"/>
            <ref name="Option"/>
            <ref name="Log"/>
            <ref name="Documentation"/>
          </choice>
        </zeroOrMore>
        <ref name="Subpipeline"/>
      </group>
    </element>
  </define>
  <define name="IterationSource" sa:class="language-construct">
    <element name="iteration-source">
      <optional>
        <ref name="select.attr"/>
      </optional>
      <ref name="common.attributes"/>
      <interleave>
        <optional>
          <choice>
            <ref name="Empty"/>
            <oneOrMore>
              <choice>
                <ref name="Pipe"/>
                <ref name="Document"/>
                <ref name="Inline"/>
              </choice>
            </oneOrMore>
          </choice>
        </optional>
        <zeroOrMore>
          <ref name="Documentation"/>
        </zeroOrMore>
      </interleave>
    </element>
  </define>
  <!-- ============================================================ -->
  <define name="Viewport" sa:class="language-construct">
    <element name="viewport">
      <optional>
        <ref name="name.attr"/>
      </optional>
      <attribute name="match">
        <ref name="XPathExpression"/>
      </attribute>
      <ref name="common.attributes"/>
      <group>
        <interleave>
          <group>
            <optional>
              <ref name="ViewportSource"/>
            </optional>
            <optional>
              <ref name="Output"/>
            </optional>
            <optional>
              <ref name="Log"/>
            </optional>
            <zeroOrMore>
              <ref name="Option"/>
            </zeroOrMore>
          </group>
          <zeroOrMore>
            <ref name="Documentation"/>
          </zeroOrMore>
        </interleave>
        <ref name="Subpipeline"/>
      </group>
    </element>
  </define>
  <define name="ViewportSource" sa:class="language-construct">
    <element name="viewport-source">
      <ref name="common.attributes"/>
      <interleave>
        <optional>
          <choice>
            <ref name="Pipe"/>
            <ref name="Document"/>
            <ref name="Inline"/>
          </choice>
        </optional>
        <zeroOrMore>
          <ref name="Documentation"/>
        </zeroOrMore>
      </interleave>
    </element>
  </define>
  <!-- ============================================================ -->
  <define name="Choose" sa:class="language-construct">
    <element name="choose">
      <optional>
        <ref name="name.attr"/>
      </optional>
      <ref name="common.attributes"/>
      <group>
        <zeroOrMore>
          <ref name="Documentation"/>
        </zeroOrMore>
        <optional>
          <ref name="XPathContext"/>
        </optional>
        <zeroOrMore>
          <choice>
            <ref name="When"/>
            <ref name="Documentation"/>
          </choice>
        </zeroOrMore>
        <optional>
          <ref name="Otherwise"/>
        </optional>
        <zeroOrMore>
          <ref name="Documentation"/>
        </zeroOrMore>
      </group>
    </element>
  </define>
  <define name="XPathContext" sa:class="language-construct">
    <element name="xpath-context">
      <ref name="common.attributes"/>
      <interleave>
        <optional>
          <choice>
            <ref name="Empty"/>
            <ref name="Pipe"/>
            <ref name="Document"/>
            <ref name="Inline"/>
          </choice>
        </optional>
        <zeroOrMore>
          <ref name="Documentation"/>
        </zeroOrMore>
      </interleave>
    </element>
  </define>
  <define name="When" sa:class="language-construct">
    <element name="when">
      <attribute name="test">
        <ref name="XPathExpression"/>
      </attribute>
      <ref name="common.attributes"/>
      <group>
        <zeroOrMore>
          <ref name="Documentation"/>
        </zeroOrMore>
        <optional>
          <ref name="XPathContext"/>
        </optional>
        <zeroOrMore>
          <choice>
            <ref name="Output"/>
            <ref name="Option"/>
            <ref name="Log"/>
            <ref name="Documentation"/>
          </choice>
        </zeroOrMore>
        <ref name="Subpipeline"/>
      </group>
    </element>
  </define>
  <define name="Otherwise" sa:class="language-construct">
    <element name="otherwise">
      <ref name="common.attributes"/>
      <group>
        <zeroOrMore>
          <choice>
            <ref name="Output"/>
            <ref name="Option"/>
            <ref name="Log"/>
            <ref name="Documentation"/>
          </choice>
        </zeroOrMore>
        <ref name="Subpipeline"/>
      </group>
    </element>
  </define>
  <!-- ============================================================ -->
  <define name="Group" sa:class="language-construct">
    <element name="group">
      <optional>
        <ref name="name.attr"/>
      </optional>
      <ref name="common.attributes"/>
      <group>
        <zeroOrMore>
          <choice>
            <ref name="Output"/>
            <ref name="Option"/>
            <ref name="Log"/>
            <ref name="Documentation"/>
          </choice>
        </zeroOrMore>
        <ref name="Subpipeline"/>
      </group>
    </element>
  </define>
  <!-- ============================================================ -->
  <define name="Try" sa:class="language-construct">
    <element name="try">
      <optional>
        <ref name="name.attr"/>
      </optional>
      <ref name="common.attributes"/>
      <group>
        <zeroOrMore>
          <ref name="Documentation"/>
        </zeroOrMore>
        <ref name="Group"/>
        <zeroOrMore>
          <ref name="Documentation"/>
        </zeroOrMore>
        <ref name="Catch"/>
        <zeroOrMore>
          <ref name="Documentation"/>
        </zeroOrMore>
      </group>
    </element>
  </define>
  <define name="Catch" sa:class="language-construct">
    <element name="catch">
      <optional>
        <ref name="name.attr"/>
      </optional>
      <ref name="common.attributes"/>
      <group>
        <zeroOrMore>
          <choice>
            <ref name="Output"/>
            <ref name="Option"/>
            <ref name="Log"/>
            <ref name="Documentation"/>
          </choice>
        </zeroOrMore>
        <ref name="Subpipeline"/>
      </group>
    </element>
  </define>
  <!-- ============================================================ -->
  <define name="OtherAtomicStep" sa:class="language-construct">
    <element>
      <anyName>
        <except>
          <name>p:pipeline</name>
          <name>p:pipeline-library</name>
          <name>p:import</name>
          <name>p:declare-step</name>
          <name>p:input</name>
          <name>p:output</name>
          <name>p:parameter</name>
          <name>p:import-parameter</name>
          <name>p:pipe</name>
          <name>p:document</name>
          <name>p:inline</name>
          <name>p:for-each</name>
          <name>p:iteration-source</name>
          <name>p:viewport</name>
          <name>p:viewport-source</name>
          <name>p:choose</name>
          <name>p:xpath-context</name>
          <name>p:when</name>
          <name>p:otherwise</name>
          <name>p:group</name>
          <name>p:try</name>
          <name>p:catch</name>
          <name>p:documentation</name>
          <nsName ns="http://www.w3.org/1999/xhtml"/>
        </except>
      </anyName>
      <optional>
        <ref name="name.attr"/>
      </optional>
      <zeroOrMore>
        <ref name="option.attr"/>
      </zeroOrMore>
      <zeroOrMore>
        <ref name="extension.attr"/>
      </zeroOrMore>
      <ref name="common.attributes"/>
      <zeroOrMore>
        <choice>
          <ref name="Input"/>
          <ref name="Option"/>
          <ref name="Parameter"/>
          <ref name="Log"/>
          <ref name="Documentation"/>
        </choice>
      </zeroOrMore>
    </element>
  </define>
  <define name="OtherCompoundStep" sa:class="language-construct">
    <element>
      <anyName>
        <except>
          <name>p:pipeline</name>
          <name>p:pipeline-library</name>
          <name>p:import</name>
          <name>p:declare-step</name>
          <name>p:input</name>
          <name>p:output</name>
          <name>p:parameter</name>
          <name>p:import-parameter</name>
          <name>p:pipe</name>
          <name>p:document</name>
          <name>p:inline</name>
          <name>p:for-each</name>
          <name>p:iteration-source</name>
          <name>p:viewport</name>
          <name>p:viewport-source</name>
          <name>p:choose</name>
          <name>p:xpath-context</name>
          <name>p:when</name>
          <name>p:otherwise</name>
          <name>p:group</name>
          <name>p:try</name>
          <name>p:catch</name>
          <name>p:documentation</name>
          <nsName ns="http://www.w3.org/1999/xhtml"/>
        </except>
      </anyName>
      <optional>
        <ref name="name.attr"/>
      </optional>
      <zeroOrMore>
        <ref name="option.attr"/>
      </zeroOrMore>
      <zeroOrMore>
        <ref name="extension.attr"/>
      </zeroOrMore>
      <ref name="common.attributes"/>
      <group>
        <zeroOrMore>
          <choice>
            <ref name="Input"/>
            <ref name="Output"/>
            <ref name="Option"/>
            <ref name="Log"/>
            <ref name="Documentation"/>
          </choice>
        </zeroOrMore>
        <ref name="Subpipeline"/>
      </group>
    </element>
  </define>
  <define name="OtherStep">
    <choice>
      <ref name="OtherAtomicStep"/>
      <ref name="OtherCompoundStep"/>
    </choice>
  </define>
  <!-- ============================================================ -->
  <define name="Documentation" sa:ignore="yes" sa:class="language-construct">
    <element name="p:documentation">
      <ref name="common.attributes"/>
      <zeroOrMore>
        <ref name="DocContent"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="DocContent" sa:model="any-well-formed-content">
    <choice>
      <text/>
      <ref name="Any"/>
    </choice>
  </define>
  <!-- ============================================================ -->
  <define name="Ignored" sa:model="anyIgnoredElement">
    <ref name="AnyOther"/>
  </define>
  <!-- ============================================================ -->
  <define name="_any.attr">
    <attribute>
      <anyName/>
    </attribute>
  </define>
  <define name="option.attr">
    <attribute>
      <nsName ns="">
        <except>
          <name ns="">name</name>
        </except>
      </nsName>
    </attribute>
  </define>
  <define name="extension.attr">
    <attribute>
      <anyName>
        <except>
          <nsName ns=""/>
          <nsName ns="http://www.w3.org/XML/1998/namespace"/>
        </except>
      </anyName>
    </attribute>
  </define>
  <define name="AnyOther">
    <element>
      <anyName>
        <except>
          <nsName/>
        </except>
      </anyName>
      <zeroOrMore>
        <choice>
          <ref name="_any.attr"/>
          <text/>
          <ref name="Any"/>
        </choice>
      </zeroOrMore>
    </element>
  </define>
  <define name="Any" sa:model="anyElement">
    <element>
      <anyName/>
      <zeroOrMore>
        <choice>
          <ref name="_any.attr"/>
          <text/>
          <ref name="Any"/>
        </choice>
      </zeroOrMore>
    </element>
  </define>
  <!-- ============================================================ -->
  <define name="VocabParameter" sa:class="step-vocabulary">
    <element name="c:parameter">
      <attribute name="name"/>
      <optional>
        <attribute name="namespace">
          <data type="anyURI"/>
        </attribute>
      </optional>
      <attribute name="value"/>
      <empty/>
    </element>
  </define>
  <define name="VocabParameterList" sa:class="step-vocabulary">
    <element name="c:parameter-list">
      <zeroOrMore>
        <ref name="VocabParameter"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="VocabResult" sa:class="step-vocabulary">
    <element name="c:result">
      <optional>
        <attribute name="value"/>
      </optional>
      <optional>
        <attribute name="href">
          <data type="anyURI"/>
        </attribute>
      </optional>
      <empty/>
    </element>
  </define>
  <define name="VocabHttpRequest" sa:class="step-vocabulary">
    <element name="c:http-request">
      <optional>
        <attribute name="method">
          <data type="NCName"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="href">
          <data type="anyURI"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="status-only">
          <choice>
            <value>yes</value>
            <value>no</value>
          </choice>
        </attribute>
      </optional>
      <optional>
        <attribute name="override-content-type"/>
      </optional>
      <group>
        <zeroOrMore>
          <ref name="VocabHeader"/>
        </zeroOrMore>
        <optional>
          <choice>
            <ref name="VocabMultipart"/>
            <ref name="VocabBody"/>
          </choice>
        </optional>
      </group>
    </element>
  </define>
  <define name="VocabHeader" sa:class="step-vocabulary">
    <element name="c:header">
      <attribute name="name"/>
      <optional>
        <attribute name="value"/>
      </optional>
      <empty/>
    </element>
  </define>
  <define name="VocabMultipart" sa:class="step-vocabulary">
    <element name="c:multipart">
      <optional>
        <attribute name="content-type">
          <data type="string" datatypeLibrary=""/>
        </attribute>
      </optional>
      <oneOrMore>
        <ref name="VocabBody"/>
      </oneOrMore>
    </element>
  </define>
  <define name="VocabBody" sa:class="step-vocabulary">
    <element name="c:body">
      <attribute name="content-type">
        <data type="string" datatypeLibrary=""/>
      </attribute>
      <optional>
        <attribute name="encoding"/>
      </optional>
      <optional>
        <attribute name="id"/>
      </optional>
      <optional>
        <attribute name="description"/>
      </optional>
      <zeroOrMore>
        <ref name="Any"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="VocabHttpResponse" sa:class="step-vocabulary">
    <element name="c:http-response">
      <optional>
        <attribute name="status">
          <data type="integer"/>
        </attribute>
      </optional>
      <group>
        <zeroOrMore>
          <ref name="VocabHeader"/>
        </zeroOrMore>
        <optional>
          <choice>
            <ref name="VocabMultipart"/>
            <ref name="VocabBody"/>
          </choice>
        </optional>
      </group>
    </element>
  </define>
  <define name="VocabQuery" sa:class="step-vocabulary">
    <element name="c:query">
      <text/>
    </element>
  </define>
  <!-- ============================================================ -->
  <define name="Errors" sa:class="error-vocabulary">
    <element name="err:errors">
      <zeroOrMore>
        <ref name="Error"/>
      </zeroOrMore>
    </element>
  </define>
  <define name="Error" sa:class="error-vocabulary">
    <element name="err:error">
      <optional>
        <attribute name="name">
          <data type="NCName"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="type">
          <data type="QName"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="code">
          <data type="QName"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="href">
          <data type="anyURI"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="line">
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="column">
          <data type="integer"/>
        </attribute>
      </optional>
      <optional>
        <attribute name="offset">
          <data type="integer"/>
        </attribute>
      </optional>
      <zeroOrMore>
        <choice>
          <text/>
          <ref name="Any"/>
        </choice>
      </zeroOrMore>
    </element>
  </define>
</grammar>
