<?xml version="1.0" standalone="no"?>
<!--
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
-->

<!DOCTYPE s1 SYSTEM "sbk:/style/dtd/document.dtd">

<s1 title="Sample: XInclude">

    <s2 title="XInclude">
        <p>The XInclude example uses the provided DOM API to parse an XML file
           while expanding the xi:include elements. It then writes
           the resulting DOM tree in the expanded form.</p>

        <s3 title="Running XInclude">

          <p>The XInclude sample converts an input XML file into
          an expanded output XML file. To run XInclude, enter the following </p>
<source>XInclude &lt;Input XML file&gt; &lt;Output XML file&gt;</source>
          <p>The following parameters may be set from the command line </p>
<source>
Usage:
    XInclude [-h] InputFile OutputFile
  -h :             Prints this help message and exits.
</source>
        </s3>
    </s2>
</s1>
