﻿<?xml version="1.0"?>

<!DOCTYPE eolas SYSTEM "/_xs/eolas/DTD">

<eolas xmlns:xlink="http://www.w3.org/1999/xlink">
	<summary>
		<title>Practical XML</title>
		<description>Overview of and practical uses for XML.</description>
		<abstract>Overview of and practical uses for XML.  Various XML standards and tools are covered, including XSLT, a language for transforming XML. Two real-world uses of XML are surveyed: as content for a website and for giving presentations.</abstract>
		<author xlink:href="http://sial.org/contact/">
			<first-name>Jeremy</first-name><last-name>Mates</last-name>
		</author>
		<date>2002-12-12</date>
		<rights>The author disclaims all copyrights and releases this document into the public domain.</rights>
		<source xlink:href="http://sial.org/talks/pratical-xml/"/>
		<version>$Id: practical-xml.xml,v 1.2 2006/06/01 04:26:15 jmates Exp $</version>
	</summary>

	<section>
	  <title>Goals</title>
    <list>
      <li>Improvement over HTML?</li>
      <li>Something to present with?</li>
    </list>
	</section>

	<section>
	  <title>XML Overview</title>
	  <info>“Extensible Markup Language (XML) is a simple, very flexible text format derived from SGML. Originally designed to meet the challenges of large-scale electronic publishing, XML is also playing an increasingly important role in the exchange of a wide variety of data on the Web and elsewhere.” — <link xlink:href="http://www.w3.org/XML/">W3C XML Introduction</link>.</info>

    <section>
      <title>XML Syntax</title>
      <list>
        <li><link xlink:href="http://www.w3.org/TR/REC-xml">Syntax details</link>.</li>
        <li>Stricter than (web browser) HTML.</li>
        <list>
          <li>Closing tags mandatory.</li>
          <li>No overlapping elements.</li>
          <li>Quote attribute values.</li>
        </list>
      </list>
      
      <section>
        <title>Leading Elements</title>
        <list>
          <li><link xlink:href="http://www.unicode.org/unicode/faq/utf_bom.html#22">Unicode <acronym><abbr>BOM</abbr><name>Byte Order Mark</name></acronym></link> - optional.</li>
          <list>
            <li>Some parsers choke on it.</li>
          </list>
          <li><em>XML Declaration</em> - optional.</li>
          <data>
            <line>&lt;?xml version="1.0" encoding="iso-8859-2"?&gt;</line>
          </data>
          <list>
            <li>Hint content is XML.</li>
            <li>Specify document character set.</li>
            <list>
              <li>Default: UTF-8.</li>
            </list>
          </list>
        </list>
      </section>
      
      <section>
        <title>Validity</title>
        <list>
          <li>Well-formed vs. valid.</li>
          <li><acronym><abbr>DTD</abbr><name>Document Type Declaration</name></acronym> - optional.</li>
          <data>
            <line>&lt;!DOCTYPE eolas SYSTEM "http://sial.org/_xs/eolas/DTD"&gt;</line>
          </data>
          <list>
            <li>Identifies format (DocBook, SVG).</li>
            <li>Specification of allowed elements and attributes.</li>
            <li>External entity definitions.</li>
          </list>
          <li>Alternative: <link xlink:href="http://www.w3.org/XML/Schema">XML Schema</link>.</li>
          <list>
            <li>Less well supported.</li>
            <li>Allows validation of non-XML content.</li>
          </list>
        </list>
      </section>
      
      <section>
        <title>Processing Instructions</title>
        <list>
          <li>optional hints to applications.</li>
          <data>
            <line>&lt;?xml-stylesheet href="html.xsl" type="text/xsl" title="default"?&gt;</line>
          </data>
          <li><code>xml-stylesheet</code>: associates transformation rules with document.</li>
        </list>
      </section>
      
      <section>
        <title>Namespaces</title>
        <list>
          <li>Mix XML formats.</li>
          <li>Group related elements.</li>
          <li>Support common things.</li>
          <list>
            <li><acronym xlink:href="http://backend.userland.com/rss"><abbr>RSS</abbr><name>Really Simple Syndication</name></acronym>.</li>
            <li><acronym xlink:href="http://www.w3.org/TR/xlink/"><abbr>XLink</abbr><name>XML Linking Language</name></acronym>.</li>
            <data>
              <line>&lt;eolas xmlns:xlink="http://www.w3.org/1999/xlink"&gt;</line>
              <line> …</line>
              <line>  &lt;acronym xlink:href="http://www.w3.org/TR/xlink/"&gt;</line>
              <line>    &lt;abbr&gt;XLink&lt;/abbr&gt;</line>
              <line>    &lt;name&gt;XML Linking Language&lt;/name&gt;</line>
              <line>  &lt;/acronym&gt;</line>
              <line> …</line>
              <line>&lt;/eolas&gt;</line>
            </data>
          </list>
        </list>
      </section>
    </section>
    
    <section>
      <title>XML Formats</title>
      <list>
        <li><link xlink:href="http://www.docbook.org/">DocBook</link>.</li>
        <li><acronym xlink:href="http://www.w3.org/TR/SVG/"><abbr>SVG</abbr><name>Scalable Vector Graphics</name></acronym>.</li>
        <li><acronym xlink:href="http://www.w3.org/TR/xhtml1/"><abbr>XHTML</abbr><name>Extensible HyperText Markup Language</name></acronym>.</li>
        <li><acronym xlink:href="http://www.w3.org/TR/xslt"><abbr>XSLT</abbr><name>Extensible Stylesheet Language for Transformations</name></acronym>.</li>
        <li><link xlink:href="http://www.w3.org/TR/xsl/">XSL-FO</link>.</li>
        <li>&amp; etc.</li>
      </list>
    </section>

    <section>
      <title>Format Design</title>
      <list>
        <li>Data vs. narrative formats.</li>
        <list>
          <li>Data: CVS Change Logs.</li>
          <li>Narrative: howto docs, presentations.</li>
        </list>
        <li>(Web browser) HTML poor starting point.</li>
        <li>Reuse existing formats, namespaces.</li>
        <list>
          <li>Only where practical.</li>
          <li>Alternate namespaces complicate stylesheets.</li>
        </list>
      </list>
    </section>
  </section>

  <section>
    <title>XSLT</title>
    <info>“XSLT is designed for use as part of XSL, which is a stylesheet language for XML. In addition to XSLT, XSL includes an XML vocabulary for specifying formatting. XSL specifies the styling of an XML document by using XSLT to describe how the document is transformed into another XML document that uses the formatting vocabulary.”</info>

    <info>“XSLT is also designed to be used independently of XSL. However, XSLT is not intended as a completely general-purpose XML transformation language. Rather it is designed primarily for the kinds of transformations that are needed when XSLT is used as part of XSL.” — <link xlink:href="http://www.w3.org/TR/xslt">W3C XSLT Abstract</link>.</info>

    <section>
      <title>XSLT Overview</title>
      <list>
        <li>Taken off independent of XSL.</li>
        <list>
          <li>Many implementations.</li>
          <li>Generally fast.</li>
        </list>
        <li>Good for structural changes.</li>
        <list>
          <li>XML thru XSLT to HTML plus CSS</li>
          <li>XML elements become CSS classes.</li>
        </list>
        <li><link xlink:href="http://www.kuro5hin.org/story/2002/1/15/1562/95011">Limited abilities</link> on content.</li>
        <li>Future: <link xlink:href="http://www.exslt.org/">EXSLT</link>, <link xlink:href="http://www.w3.org/TR/xslt20/">XSLT2</link>.</li>
      </list>
    </section>

<!-- TODO do workflow slides work? -->
    <section>
      <title>Work Flow</title>
      <image-svg xlink:href="workflow.svg"/>
    </section>

    <section>
      <title>Discussion</title>
      <list>
        <li>XSLT best producing HTML/XML.</li>
        <list>
          <li>Well-formed HTML by default.</li>
          <li>Easy to produce varied XML output.</li>
        </list>
        <li>Limited non-<code>&lt;&gt;</code> output capabilities.</li>
        <list>
          <li>Poor whitespace, wrapping control.</li>
          <li>Little power over non-XML content.</li>
        </list>
      </list>
    </section>
  </section>


  <section>
    <title>Websites using XML</title>
    <list>
      <li>XML instead of HTML files.</li>
      <li>XSLT renders XML to HTML.</li>
      <li>AxKit as glue.</li>
    </list>

    <section>
      <title>XML Format</title>
      <list>
        <li>Custom format for narrative documents.</li>
        <list>
          <li><link xlink:href="http://sial.org/_xs/eolas/">eolas</link>.</li>
          <li>Simple text blocks, lists.</li>
          <li>Good for Unix documentation.</li>
        </list>
        <li>Alternative: <link xlink:href="http://www.oasis-open.org/docbook/xml/simple/">Simplified DocBook</link>.</li>
      </list>
    </section>

    <section>
      <title>Advantages over HTML</title>
      <list>
        <li>Tags with meaning.</li>
        <data>
          <line>&lt;a href="http://www.faqs.org/rfcs/rfc1869.html"&gt;RFC 1896&lt;/a&gt;</line>
          <line/>
          <line>&lt;rfc&gt;1869&lt;/rfc&gt;</line>
        </data>
        <list>
          <li><rfc>1869</rfc>.</li>
          <li>More <link xlink:href="http://sial.org/_xs/eolas/example.xml">eolas examples</link>.</li>
        </list>
        <li>Separation of data from presentation.</li>
        <li>Customize on the fly.</li>
        <list>
          <li>No pains to support lynx.</li>
          <li>Fancy site and <link xlink:href="http://www.w3.org/TR/WAI-WEBCONTENT/">WCAG</link>/<link xlink:href="http://www.section508.gov/">Section 508</link> support.</li>
        </list>
      </list>
    </section>

<!-- TODO need slide with image showing output to various browsers, xsl:importing, and CSS file reuse! -->

    <section>
      <title>Stylesheets</title>
      <list>
        <li>XSLT for each browser or output style.</li>
        <li><code>&lt;xsl:import&gt;</code> minimize redundancy.</li>
        <li>Translate XML to HTML plus CSS.</li>
        <list>
          <li>CSS for main stylesheet (eolas, DocBook).</li>
          <li>Tie data-driven output to existing CSS.</li>
        </list>
        <li>Stylesheet choice via Processing Instruction.</li>
        <data>
          <line>&lt;?xml version="1.0"?&gt;</line>
          <line>&lt;?xml-stylesheet href="default.xsl" type="text/xsl" title="default"?&gt;</line>
          <line>&lt;?xml-stylesheet href="lynx.xsl" type="text/xsl" title="lynx" alternate="yes"?&gt;</line>
        </data>
      </list>
    </section>

    <section>
      <title>Stylesheet Setup</title>
      <list>
        <li><link xlink:href="http://docbook.sourceforge.net/">DocBook stylesheets</link> source.</li>
        <list>
          <li><link xlink:href="http://docbook.sourceforge.net/projects/xsl/">DocBook XSL Stylesheets</link>.</li>
        </list>
        <li>Can be tricky to setup.</li>
        <li>Use local DTDs.</li>
        <list>
          <data>
            <line>&lt;!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.0//EN"</line>
            <line>  "<em>http://www.oasis-open.org/docbook/xml/4.0/docbookx.dtd</em>"&gt;</line>
          </data>
          <li>Faster rendering.</li>
          <li>Network outage tolerant.</li>
        </list>
      </list>
    </section>

    <section>
      <title>AxKit</title>
      <info>“Apache AxKit is an XML Application Server for Apache. It provides on-the-fly conversion from XML to any format, such as HTML, WAP or text using either W3C standard techniques, or flexible custom code. AxKit also uses a built-in Perl interpreter to provide some amazingly powerful techniques for XML transformation.” — <link xlink:href="http://www.axkit.org/">AxKit.org Introduction</link>.</info>

      <section>
        <title>AxKit Needs</title>
        <list>
          <li><link xlink:href="http://www.apache.org/">Apache 1.3</link>.</li>
          <li><link xlink:href="http://perl.apache.org/">mod_perl</link>.</li>
          <li>XML, XSLT Libraries.</li>
          <list>
            <li><link xlink:href="http://expat.sourceforge.net/">expat</link>.</li>
            <li><link xlink:href="http://www.xmlsoft.org/">libxml2, libxslt</link>.</li>
          </list>
          <li>Various CPAN Modules.</li>
        </list>
        <info>As of AxKit version 1.6; see the <link xlink:href="http://www.axkit.org/mailinglist.xml">AxKit mailing list</link> for discussion of potential problems with specific releases (e.g. XML and XSLT libraries).</info>
      </section>

      <section>
        <title>Needs for AxKit</title>
        <list>
          <li>Mapping browsers to stylesheets.</li>
          <li>Mapping XML to stylesheets.</li>
          <li>XSLT transformations.</li>
          <li>Static output caching.</li>
        </list>
      </section>

      <section>
        <title>Request Overview</title>
        <image-svg xlink:href="website-overview.svg"/>
      </section>

      <section>
        <title>Browser Requests</title>
        <list>
          <li>Stylesheets customize content to browser.</li>
          <list>
            <li>Via HTTP <code>User-Agent</code> header.</li>
            <li>Or manually by URL query <code>?style=</code>.</li>
            <li>XHTML or HTML, as required.</li>
            <li><code>&lt;xsl:import&gt;</code> reduce stylesheet redundancy.</li>
          </list>
          <li>Cache for subsequent requests.</li>
          <data>
            <shell prefix="$ ">du -sh htdocs ../tmp/axkit-cache</shell>
            <line>2.3M    htdocs</line>
            <line>6.3M    ../tmp/axkit-cache</line>
          </data>
        </list>
      </section>

      <section>
        <title>Apache Config for AxKit</title>
        <list>
          <li><perl-module>AxKit</perl-module> documentation for details.</li>
          <li>Global setup in <file>conf/httpd.conf</file>.</li>
          <data>
            <line>&lt;IfModule mod_perl.c&gt;</line>
            <line>  PerlModule AxKit</line>
            <line/>
            <line>  PerlFreshRestart On</line>
            <line>&lt;/IfModule&gt;</line>
          </data>
        </list>
        
        <section>
          <title>Configuration Sections</title>
          <info>Inside <code>&lt;Files&gt;</code>, <code>&lt;Location&gt;</code>,
     <code>&lt;Directory&gt;</code>, or <file>.htaccess</file>.</info>
          <data>
            <line><comment># limit what filetypes AxKit deals with</comment></line>
            <line>AddHandler axkit .xml .dkb</line>
            <line/>
            <line><comment># use libxml2/libxslt for XSLT work</comment></line>
            <line>AxAddStyleMap text/xsl Apache::AxKit::Language::LibXSLT</line>
            <line/>
            <line><comment># custom page instead of "500 server in flames"</comment></line>
            <line>AxErrorStylesheet text/xsl /_xs/axkit/error.xsl</line>
            <line/>
            <line><comment># good for static content</comment></line>
            <line>AxCacheDir /tmp/axkit-cache</line>
            <line>AxGzipOutput On</line>
            <line/>
            <line><comment># make various request data available to stylesheets</comment></line>
            <line>AxAddPlugin Apache::AxKit::Plugin::AddXSLParams::Request</line>
            <line>PerlSetVar AxAddXSLParamGroups "Request-Common"</line>
          </data>
        </section>
        
        <section>
          <title>Files &amp; Exceptions</title>
          <data>
            <line><comment># file extension mapping</comment></line>
            <line>&lt;Files *.dkb&gt;</line>
            <line>  AxAddProcessor text/xsl /_xs/docbook/html/docbook.xsl</line>
            <line>&lt;/Files&gt;</line>
            <line/>
            <line><comment># spare /wc3/p3p.xml from AxKit</comment></line>
            <line>&lt;Location /w3c/&gt;</line>
            <line>  AxResetStyleMap</line>
            <line>  AxResetProcessors</line>
            <line>&lt;/Location&gt;</line>
          </data>
        </section>
        
        <section>
          <title>Browser/XML Mapping</title>
          <list>
            <li>Stylesheet choice in Apache config.</li>
          </list>
          <data>
            <line><comment># map HTTP User-Agent by regex to stylesheet title</comment></line>
            <line>AxAddPlugin Apache::AxKit::StyleChooser::UserAgent</line>
            <line>PerlSetVar AxUAStyleMap "lynx   =&gt; Lynx,\</line>
            <line>                         mozmac =&gt; ^Mozilla\/.+?Macintosh.+?Gecko"</line>
            <line></line>
            <line><comment># map ?style=lynx arguments to stylesheet title</comment></line>
            <line>AxAddPlugin Apache::AxKit::StyleChooser::QueryString</line>
            <line></line>
            <line><comment># map stylesheet titles to various XML formats</comment></line>
            <line>&lt;AxStyleName "#default"&gt;</line>
            <line>  AxAddRootProcessor text/xsl /_xs/eolas/default.xsl eolas</line>
            <line/>
            <line>  AxAddRootProcessor text/xsl /_xs/docbook/xhtml/docbook.xsl book</line>
            <line/>
            <line>  AxAddRootProcessor text/xsl /_xs/cvs2cl/default.xsl changelog</line>
            <line>&lt;/AxStyleName&gt;</line>
            <line/>
            <line>&lt;AxStyleName "lynx"&gt;</line>
            <line>  AxAddRootProcessor text/xsl /_xs/eolas/lynx.xsl eolas</line>
            <line/>
            <line>  AxAddRootProcessor text/xsl /_xs/docbook/html/docbook.xsl book</line>
            <line/>
            <line>  AxAddRootProcessor text/xsl /_xs/cvs2cl/lynx.xsl changelog</line>
            <line>&lt;/AxStyleName&gt;</line>
            <line/>
            <line>&lt;AxStyleName "mozmac"&gt;</line>
            <line> …</line>
          </data>
        </section>
        
        <section>
          <title>Random Tips</title>
          <list>
            <li>Imperial character set mandates?</li>
            <data>
              <line>AddDefaultCharset utf-8</line>
            </data>
            <li>Support for SVG in <file>conf/mime.types</file>.</li>
            <data>
              <line>image/svg+xml                   svg svgz</line>
            </data>
          </list>
        </section>
      </section>        
    </section>

    <section>
      <title>Alternatives</title>
      <list>
        <li>Other XML handlers: <link xlink:href="http://www.caucho.com/resin/">Resin</link>, etc.</li>
        <li>Caching: <link xlink:href="http://httpd.apache.org/docs/mod/mod_proxy.html">mod_proxy</link> or <link xlink:href="http://www.squid-cache.org/">squid</link>.</li>
        <list>
          <li>More flexible.</li>
          <li>Better for dynamic content?</li>
        </list>
        <li>Pre-render XML.</li>
        <list>
          <li>Easier to setup and run.</li>
          <li>Fallback site if AxKit down.</li>
        </list>
      </list>
    </section>

    <section>
      <title>Conclusion</title>
      <list>
        <li>HTML/XML same domain already.</li>
        <li>Separation of content from style.</li>
        <li>Content customized to user’s needs.</li>
        <li>Ease of new agent support.</li>
      </list>
    </section>
  </section>


  <section>
    <title>Presentations using XML</title>
    <list>
      <li>Custom XML format.</li>
      <li>XSLT renders XSL-FO.</li>
      <li>XSL-FO to output media.</li>
      <list>
        <li>Slides for screen display (PDF).</li>
        <li>Handouts for you (PDF).</li>
      </list>
    </list>
    
    <section>
      <title>XML Format</title>
      <list>
        <li><link xlink:href="http://sial.org/_xs/eolas/">eolas</link> format again.</li>
        <li>Single format to learn.</li>
        <li>Easy web display of talks.</li>
        <li>Alternative: <link xlink:href="http://docbook.sourceforge.net/projects/slides/">DocBook Slides</link>.</li>
      </list>
    </section>
    
    <section>
      <title>XSLT to XSL-FO</title>
      <list>
        <li>No shareability with website stylesheets.</li>
        <li>Generates Formatting Objects.</li>
        <li>XSL-FO: <link xlink:href="http://www.oreilly.com/catalog/xslfo/">“Making XML Look Good in Print.”</link></li>
      </list>
    </section>

<!-- TODO expand this... maybe positive/negative slides -->
    <section>
      <title>XSL</title>
      <list>
        <li>Young format.</li>
        <li>XML, XPath, XSLT, CSS basis.</li>
        <li>1.0 specification limitations.</li>
        <list>
          <li>Slow.</li>
          <li>… ?</li>
        </list>
        <li>Documentation for engine implementors.</li>
        <list>
          <li>New book: <link xlink:href="http://www.oreilly.com/catalog/xslfo/">XSL-FO</link>.</li>
        </list>
        <li>Engine-specific PDF Bookmark generation.</li>
      </list>
    </section>

<!-- TODO does unfied fit with flow of talk?? -->
<!--
    <section>
      <title>Work Flow: Unified</title>
      <image-svg xlink:href="workflow-unified.svg"/>
    </section>

    <section>
      <title>Unified Discussion</title>
      <list>
        <li>Single format for final output conversion.</li>
        <list>
          <li>Good for publication.</li>
          <li>Separate publication and data groups?</li>
        </list>
      </list>
    </section>
-->

    <section>
      <title>FOP</title>
      <info>“FOP (Formatting Objects Processor) is the world's first print formatter driven by XSL formatting objects and the world's first output independent formatter. It is a Java application that reads a formatting object tree and then renders the resulting pages to a specified output. Output formats currently supported are PDF, PCL, PS, SVG, XML (area tree representation), Print, AWT, MIF and TXT. The primary output target is PDF.” — <link xlink:href="http://xml.apache.org/fop/">FOP Introduction</link>.</info>
      
      <section>
        <title>FOP Needs</title>
        <list>
          <li>Java 1.2 and up.</li>
          <li>Various Java libraries.</li>
          <list>
            <li>Most in <link xlink:href="http://xml.apache.org/dist/fop/">FOP distribution</link>.</li>
            <li><link xlink:href="http://java.sun.com/products/jimi/">JIMI Software Development Kit</link>.</li>
          </list>
        </list>
      </section>
      
      <section>
        <title>Usage</title>
        <info>Need to render XSL-FO to PDF for presentation.</info>
        <list>
          <li><cmd>xsltproc</cmd> to render XML to XSL-FO.</li>
          <list>
            <li>FOP Xalan XSLT engine weak, so use <link xlink:href="http://www.xmlsoft.org/">libxml2</link> utilities.</li>
          </list>
          <li><cmd>xmllint</cmd> to tidy XSL-FO for debugging.</li>
          <li>FO to PDF with FOP.</li>
          <data>
            <shell prefix="$ ">xsltproc fo-slides.xsl practical-xml.xml &gt; practical-xml.fo</shell>
            <shell prefix="$ ">java org.apache.fop.apps.Fop practical-xml.fo practical-xml.pdf</shell>
          </data>
          <li><file xlink:href="Makefile">Makefile</file> handy.</li>
        </list>
      </section>

      <section>
        <title>Limitations of FOP</title>
        <list>
          <li>Young tool.</li>
          <li>Extra font support tricky.</li>
          <li>Poor error reporting.</li>
          <list>
            <li>Java backtraces annoying.</li>
            <li>Sometimes cryptic.</li>
            <data>
              <shell prefix="$ ">java org.apache.fop.apps.Fop <rbr/>-xsl fo-slides.xsl <rbr/>-xml practical-xml.xml test.pdf</shell>
              <line>[INFO] FOP 0.20.4</line>
              <line>[ERROR] null</line>
            </data>
          </list>
        </list>
      </section>
    </section>

    <section>
      <title>XSL for Presentations</title>
      <list>
        <li>Not a good fit.</li>
        <li>Presentations driven by style.</li>
        <li>XSL-FO better for data-oriented needs.</li>
      </list>
    </section>

    <section>
      <title>Publication Alternatives</title>
      <list>
        <li>Other XSL-FO engines: <link xlink:href="http://www.renderx.com/">RenderX</link>, etc.</li>
        <li><link xlink:href="http://www.tei-c.org.uk/Software/passivetex/">PassiveTeX</link> - XSL-FO to LaTeX.</li>
        <li>Roll your own.</li>
        <list>
          <li>Parse and output via <perl-module>PDF::Create</perl-module>.</li>
        </list>
        <li>HTML to published format (poor match).</li>
        <list>
          <li>Links, other content lost.</li>
        </list>
      </list>
    </section>

    <section>
      <title>Conclusion</title>
      <list>
        <li>Multiple output formats nice.</li>
        <list>
          <li>HTML, PDF, etc.</li>
          <li>Easy to target new media.</li>
        </list>
        <li>XSL-FO so-so for presentations.</li>
        <li>Investigate <acronym xlink:href="http://www.w3.org/AudioVideo/"><abbr>SMIL</abbr><name>Synchronized Multimedia Integration Language</name></acronym>?</li>
      </list>
    </section>
  </section>

  <section>
    <title>XML Usage Tips</title>
    <list>
      <li>XML-aware editors: <link xlink:href="http://quanta.sourceforge.net/">Quanta</link>, <link xlink:href="http://www.altova.com/">XML Spy</link>.</li>
      <li>XML well-formed testing helps.</li>
      <data>
        <shell prefix="$ ">xmllint --noout test.xsl</shell>
      </data>
      <li>Let tools format XML for you.</li>
      <data>
        <shell prefix="$ ">xmllint --encode utf8 --format raw.xml &gt; test.xsl</shell>
      </data>
      <li>Utilities to assist content markup.</li>
    </list>

    <section>
      <title>Working with XSLT</title>
      <list>
        <li>Maintenance similar to shell scripts.</li>
        <li>Complexity proportional to <acronym><abbr>DTD</abbr><name>Document Type Description</name></acronym> flexibility.</li>
        <list>
          <li>Optional elements, attributes.</li>
          <li>Empty elements.</li>
          <li>Context of element.</li>
        </list>
        <li>Keep limitations of XSLT in mind.</li>
      </list>
  
      <section>
        <title>Testing</title>
        <list>
          <li>Create test XML documents.</li>
          <list>
            <li>Stylesheet compliance.</li>
            <li>New web browser support.</li>
            <li>Example <link xlink:href="http://sial.org/_xs/eolas/example.xml">eolas test document</link>.</li>
          </list>  
        </list>
      </section>
    
      <section>
        <title>Creation</title>
        <list>  
          <li>New stylesheets will have startup costs.</li>
          <li>Add templates, functionality as format evolves.</li>  
          <li>Catch unexpected elements in new formats.</li>
          <data>
            <line>&lt;xsl:template match="*"&gt;</line>
            <line>  &lt;xsl:message&gt;</line>
            <line>    &lt;xsl:text&gt;Unmatched: &lt;/xsl:text&gt;</line>
            <line>    &lt;xsl:value-of select="name(.)"/&gt;</line>
            <line>  &lt;/xsl:message&gt;</line>
            <line/>
            <line>  &lt;xsl:apply-templates/&gt;</line>
            <line/>
            <line>&lt;/xsl:template&gt;</line>
          </data>
          <li>See <file xlink:href="unexpected-test.xsl">unexpected-test.xsl</file> for complete example.</li>
        </list>
      </section>
    </section>
  </section>
</eolas>
