[cxml-cvs] CVS cxml/doc

dlichteblau dlichteblau at common-lisp.net
Tue May 1 18:21:41 UTC 2007


Update of /project/cxml/cvsroot/cxml/doc
In directory clnet:/tmp/cvs-serv20218/doc

Modified Files:
	cxml.css html.xsl index.xml quickstart.xml 
Log Message:
klacks:get-attribute; dribbling source fix; FAQ


--- /project/cxml/cvsroot/cxml/doc/cxml.css	2007/04/22 13:23:54	1.7
+++ /project/cxml/cvsroot/cxml/doc/cxml.css	2007/05/01 18:21:40	1.8
@@ -63,10 +63,15 @@
   background-repeat: no-repeat;
 }
 
-h1,h2,h3 {
+h1 {
   margin-left: -30px;
 }
 
+h2,h3 {
+  margin-left: -30px;
+  margin-top: 2em;
+}
+
 pre {
   background-color: #eeeeee;
   border: solid 1px #d0d0d0;
--- /project/cxml/cvsroot/cxml/doc/html.xsl	2007/03/04 21:04:11	1.4
+++ /project/cxml/cvsroot/cxml/doc/html.xsl	2007/05/01 18:21:40	1.5
@@ -4,11 +4,11 @@
 	      doctype-public="-//W3C//DTD HTML 4.01 Transitional//EN"
 	      doctype-system="http://www.w3.org/TR/html4/loose.dtd"/>
 
-	      <xsl:template match="@*|node()">
-  <xsl:copy>
-    <xsl:apply-templates select="@*|node()"/>
-  </xsl:copy>	
-</xsl:template>
+  <xsl:template match="@*|node()">
+    <xsl:copy>
+      <xsl:apply-templates select="@*|node()"/>
+    </xsl:copy>	
+  </xsl:template>
 
   <xsl:template match="documentation">
     <html>
@@ -38,7 +38,7 @@
         <li>
           <ul class="hack">
             <li>
-              <a href="quickstart.html"><b>Quick-Start Example</b></a>
+              <a href="quickstart.html"><b>Quick-Start Example / FAQ</b></a>
             </li>
           </ul>
         </li>
@@ -85,4 +85,26 @@
     </html>
   </xsl:template>
 
+  <xsl:template match="page-index">
+    <ul>
+      <xsl:for-each select="//heading">
+	<li>
+	  <a href="#{generate-id()}">
+	    <xsl:copy>
+	      <xsl:apply-templates select="node()"/>
+	    </xsl:copy>
+	  </a>
+	</li>
+      </xsl:for-each>
+    </ul>
+  </xsl:template>
+
+  <xsl:template match="heading">
+    <a name="{generate-id()}"/>
+    <h3>
+      <xsl:copy>
+	<xsl:apply-templates select="node()"/>
+      </xsl:copy>	
+    </h3>
+  </xsl:template>
 </xsl:stylesheet>
--- /project/cxml/cvsroot/cxml/doc/index.xml	2007/04/22 13:23:54	1.5
+++ /project/cxml/cvsroot/cxml/doc/index.xml	2007/05/01 18:21:40	1.6
@@ -48,8 +48,15 @@
       information</a>).
     </p>
 
+    <h3>See also</h3>
+    <p>
+      Relax NG validation is available as a separate
+      project: <a href="">cxml-rng</a>.
+    </p>
+
+
     <a name="changes"/>
-    <h2>Recent Changes</h2>
+    <h3>Recent Changes</h3>
     <p class="nomargin"><tt>rel-2007-xx-yy</tt></p>
     <ul class="nomargin">
       <li>xml:base support (SAX and Klacks only, not yet used in DOM).
--- /project/cxml/cvsroot/cxml/doc/quickstart.xml	2007/02/18 12:35:50	1.1
+++ /project/cxml/cvsroot/cxml/doc/quickstart.xml	2007/05/01 18:21:40	1.2
@@ -1,56 +1,247 @@
 <documentation title="CXML Quick-Start Example">
-    <h1>Quick-Start Example</h1>
+    <h1>Quick-Start Example / FAQ</h1>
 
     <p>
       Make sure to <a href="installation.html#installation">install and load</a> cxml first.
     </p>
 
-    <p>Create a test file called <tt>example.xml</tt>:</p>
+    <h3>
+      On this page
+    </h3>      
+    <page-index/>
+    
+    <p>
+      To try the following examples, create a test file
+      called <tt>example.xml</tt>:
+    </p>
     <pre>* <b>(with-open-file (s "example.xml" :direction :output)
     (write-string "<test a='b'><child/></test>" s))</b></pre>
 
+    <heading>Parsing a file</heading>
+
     <p>Parse <tt>example.xml</tt> into a DOM tree (<a href="sax.html#parser">read
     more</a>):</p>
     <pre>* <b>(cxml:parse-file "example.xml" (cxml-dom:make-dom-builder))</b>
 #<DOM-IMPL::DOCUMENT @ #x72206172>
+
 ;; save result for later:
 * <b>(defparameter *example* *)</b>
 *EXAMPLE*</pre>
 
+    <heading>Using DOM</heading>
+
     <p>Inspect the DOM tree (<a href="sax.html#dom">read more</a>):</p>
     <pre>* <b>(dom:document-element *example*)</b>
 #<DOM-IMPL::ELEMENT test @ #x722b6ba2>
-* <b>(dom:tag-name (dom:document-element *example*))</b>
+
+* (<b>dom:tag-name</b> (dom:document-element *example*))
 "test"
-* <b>(dom:child-nodes (dom:document-element *example*))</b>
+
+* (<b>dom:child-nodes</b> (dom:document-element *example*))
 #(#<DOM-IMPL::ELEMENT child @ #x722b6d8a>)
-* <b>(dom:get-attribute (dom:document-element *example*) "a")</b>
+
+* (<b>dom:get-attribute</b> (dom:document-element *example*) <b>"a"</b>)
 "b"</pre>
 
+    <heading>Serializing DOM</heading>
+
     <p>Serialize the DOM document back into a file (<a
     href="sax.html#serialization">read more</a>):</p>
-    <pre><b>(with-open-file (out "example.out" :direction :output :element-type '(unsigned-byte 8))
-  (dom:map-document (cxml:make-octet-stream-sink out) *example*))</b></pre>
+    <pre>(with-open-file (out "example.out" :direction :output :element-type '(unsigned-byte 8))
+  <b>(dom:map-document (cxml:make-octet-stream-sink out) *example*)</b></pre>
+
+    <heading>Parsing into XMLS-like lists</heading>
+
+    <p>
+      If DOM is not the representation you want to you, parsing into
+      other data structures is possible using the same SAX parser
+      function, while using a different handler.
+      The XMLS builder is included for compatibility with XMLS, and also
+      also sample code (see cxml/xml/xmls-compat.lisp) for your own
+      handlers.
+    </p>
 
     <p>As an alternative to DOM, parse into xmls-compatible list
     structure (<a href="xmls-compat.html">read more</a>):</p>
     <pre>* <b>(cxml:parse-file "example.xml" (cxml-xmls:make-xmls-builder))</b>
 ("test" (("a" "b")) ("child" NIL))</pre>
 
+    <p>
+      Again, serialization into XML is done using a sink as a SAX
+      handler and a data-structure specific function to generate SAX
+      events for the document, in this case <tt>cxml-xmls:map-node</tt>.
+    </p>
+
+    <pre>* (with-open-file (out "example.out" :direction :output :element-type '(unsigned-byte 8))
+    (<b>cxml-xmls:map-node (cxml:make-octet-stream-sink out)
+                        '("test" (("a" "b")) ("child" nil)))</b>)</pre>
+
+    <heading>Parsing incrementally using Klacks</heading>
+
     <p>Use klacks to read events from the parser incrementally.  The
     following example looks only for :start-element and :end-element
     events and prints them (<a href="klacks.html">read more</a>):</p>
     <pre>* <b>(klacks:with-open-source
-    (s (cxml:make-source #p"example.xml"))
+    (s (cxml:make-source #p"example.xml"))</b>
   (loop
-      for key = (klacks:peek s)
+      for key = <b>(klacks:peek s)</b>
       while key
       do
 	(case key
 	  (:start-element
-	    (format t "~A {" (klacks:current-qname s)))
+	    (format t "~A {" <b>(klacks:current-qname s)</b>))
 	  (:end-element
 	    (format t "}")))
-	(klacks:consume s)))</b>
+	<b>(klacks:consume s)</b>))
 test {child {}}</pre>
+
+    <heading>Writing XML</heading>
+
+    <p>
+      Serialization is always done using sinks, which accept SAX events,
+      but there are convenience functions and macros to make that easier
+      to use:
+    </p>
+    <pre>(cxml:with-xml-output (cxml:make-octet-stream-sink stream :indentation 2 :canonical nil)
+  (cxml:with-element "foo"
+    (cxml:attribute "xyz" "abc")
+    (cxml:with-element "bar"
+      (cxml:attribute "blub" "bla"))
+    (cxml:text "Hi there.")))</pre>
+   <p>
+      Prints this to <tt>stream</tt>:
+   </p>
+   <pre><foo xyz="abc">
+  <bar blub="bla"></bar>
+  Hi there.
+</foo></pre>
+    
+    <heading>Help! CXML says 'URI scheme :HTTP not supported'</heading>
+
+    <p>
+      By default, this error will occur when the DTD (or generally, any
+      entity) has an http:// URL as its system ID.  CXML itself
+      understands only file:// URLs, but allows users to customize the
+      behaviour for all URLs.
+    </p>
+
+    <p>
+      The are several solutions to this, covered in detail below:
+      <ul>
+	<li>
+	  Load the DTD/entity from local files using an entity resolver
+	</li>
+	<li>
+	  Skip parsing of the DTD/entity entirely by pretending it is
+	  empty, again using an entity resolver.
+	</li>
+	<li>
+	  Use a <em>catalog</em> to make CXML find DTDs in the local
+	  filesystem automatically.
+	</li>
+	<li>
+	  Teach CXML actually load DTDs using HTTP.
+	</li>
+      </ul>
+    </p>
+
+    <p>
+      Here are the example files for the following solutions to this
+      problem:
+    </p>
+
+    <a href="http://www.lichteblau.com/blubba/dtdexample.xml">
+      <tt>dtdexample.xml</tt>:</a>
+    <pre><!DOCTYPE test SYSTEM 'http://www.lichteblau.com/blubba/dtdexample.dtd'>
+<test a='b'>blub<child/></test></pre>
+    
+    <a href="http://www.lichteblau.com/blubba/dtdexample.dtd">
+      <tt>dtdexample.dtd</tt></a>:
+    <pre><!ELEMENT test (#PCDATA|child)*>
+<!ATTLIST test
+  a CDATA #REQUIRED
+  >
+
+<!ELEMENT child EMPTY>
+</pre>
+
+    <heading>Loading DTDs from local files</heading>
+
+    <p>
+      Use the :entity-resolver argument to <tt>parse-file</tt> to
+      specify a function that maps System IDs and Public IDs to local
+      files of your choice:
+    </p>
+    
+    <pre>(let ((uri "http://www.lichteblau.com/blubba/dtdexample.dtd")
+      (pathname "dtdexample.dtd"))
+  (flet ((resolver (pubid sysid)
+	   (declare (ignore pubid))
+	   <b>(when (puri:uri= sysid (puri:parse-uri uri))
+	     (open pathname :element-type '(unsigned-byte 8)))</b>))
+    (cxml:parse-file "dtdexample.xml" (cxml-dom:make-dom-builder) <b>:entity-resolver #'resolver</b>)))</pre>
+
+
+    <heading>Can I skip loading of DTDs entirely?</heading>
+
+    <p>
+      Yes and no.
+    </p>
+    <p>
+      <i>Yes</i>, you can force CXML to do this, see the following example.
+    </p>
+    
+    <p>
+      But no, skipping the DTD will not actually work if the document
+      references entities declared in the DTD, especially since neither
+      SAX nor DOM are able to report unresolved entity references in
+      attributes.
+    </p>
+
+    <p>
+      The trick to make CXML skip the DTD is to pretend that it is empty
+      by returning a zero-length stream instead:
+    </p>
+    
+    <pre>(flet ((resolver (pubid sysid)
+	 (declare (ignore pubid sysid))
+	 <b>(flexi-streams:make-in-memory-input-stream nil)</b>))
+  (cxml:parse-file "dtdexample.xml" (cxml-dom:make-dom-builder) <b>:entity-resolver #'resolver</b>))</pre>
+
+    <heading>
+      Catalogs: How can I use the HTML DTD installed by my distribution?
+    </heading>
+
+    <p>
+      Rather than writing an entity resolver function yourself, CXML can
+      use XML catalogs to find DTDs and entity files on your local system.
+    </p>
+    <p>
+      Catalogs are particularly helpful for DTDs that are
+      pre-installed.  For example, most Linux distributions include a
+      package for the XHTML DTD.  The DTD will reside in a
+      distribution-dependent location, which the central catalog file
+      points to.
+    </p>
+    <p>By default, CXML looks for the catalog in /etc/xml/catalog
+    (Linux) and /usr/local/share/xml/catalog.ports (FreeBSD).
+    </p>
+    <pre>* <b>(setf cxml:*catalog* (cxml:make-catalog))</b>
+* (cxml:parse-file "test.xhtml" (cxml-dom:make-dom-builder))</pre>
+
+    <heading>
+      Can I load DTDs through HTTP?
+    </heading>
+
+    <p>
+      Sure, just use an entity-resolver function that does it.
+    </p>
+    <p>
+      Install <a href="http://weitz.de/drakma/">Drakma</a> and try this:
+    </p>
+    <pre>(flet ((resolver (pubid sysid)
+	 (declare (ignore pubid))
+	 <b>(when (eq (puri:uri-scheme sysid) :http)
+	   (drakma:http-request sysid :want-stream t))</b>))
+  (cxml:parse-file "dtdexample.xml" (cxml-dom:make-dom-builder) <b>:entity-resolver #'resolver</b>))</pre>
 </documentation>




More information about the Cxml-cvs mailing list