Re: Example of multiple html files from one xml file

Subject: Re: Example of multiple html files from one xml file
From: Brandon Ibach <bibach@xxxxxxxxxxxxxx>
Date: Fri, 27 Oct 2000 18:43:15 -0500
Quoting janusz.prusaczyk@xxxxxx <janusz.prusaczyk@xxxxxx>:
> Can anybody show me how to get multiple html files from one xml source?
> Let's take an example:
> 
> <?xml version='1.0' encoding="ISO-8859-2"?>
> <root>
>   <a>
>     <b>text 1</b>
>     <b>text 2</b>
>   </a>
>   <a>
>     <b>text 1</b>
>     <b>text 2</b>
>   </a>
> </root>
> 
> I want to get 7 files:
> 
> index.html :
> 
> <html>
>   <head><title></title></head>
>   <body>
>     <a href="a1.html">a1</a>
>     <a href="a2.html">a2</a>
>   </body>
> </html>
> 
> 2 files with <a></a> contents, like a2.html:
> 
> <html>
>   <head><title></title></head>
>   <body>
>     <a href="b3.html">b3</a>
>     <a href="b4.html">b4</a>
>   </body>
> </html>
> 
> and 4 files with <b></b> tag contents. The names of the files can be
> generated, but I can use ID attributes for tags as well (<a ID="a1"></a>).
> Is it possible with OpenJade? Can someone show me how to do it?
> 
   Here's a solution (untested, but covers the basic issues):

(define (file-name nd)
   (or (attribute-string "ID" node)
       (let* ((nds (select-elements
                      (descendants (node-list-property 'grove-root nd))
                      (gi nd)))
              (num (let loop ((n nds) (r 1))
                      (if (node-list-empty? n) 0
                          (if (node-list=? (node-list-first n) nd) r
                              (loop (node-list-rest n) (+ r 1)))))))
             (string-append (gi nd) (number->string num) ".html"))))

(define (make-file fname ssf)
   (make entity system-id: fname
      (make element gi: "html"
         (make element gi: "head"
            (make element gi: "title"))
         (make element gi: "body" ssf))))

(element root (make-file "index.html" (process-children)))

(define (abrule)
   (let ((f (file-name (current-node))))
      (sosofo-append
         (make-file f (process-children))
         (make element gi: "a" attributes: (list (list "href" f))
            (literal (substring f 0 (- (string-length f) 4)))))))

(element a (abrule))
(element b (abrule))


   The file-name function generates the file name to be used for an
element.  If the element has an ID attribute, it uses that, otherwise,
it concatenates the element name (GI) with a number which is the
number of elements with the same GI that precede this one in the
document.  In other words, the second <a> in the document will get
"a2.html".
   The make-file function takes a file name and a SOSOFO and generates
a file with that file name, the contents of which are an HTML document
of the structure you displayed, above, with the contents of the <body>
being whatever was passed in in the SOSOFO argument.  This function
uses the (make entity ...) construct that was mentioned earlier.  This
construct does just what it says: It creates a new entity.  "System
ID" essentially means file name (though there are other possibilities
for them).
   The abrule function is just a convenience since the <a> and <b>
elements should be handled the same.  It calls file-name to get the
file name to use for the current element, calls make-file to create
the HTML for that element, and also creates an <a> element, which will
be put in the file of the parent element.
   If you have any questions, or if anything in the above code doesn't
work, let me know.

-Brandon :)


 DSSSList info and archive:  http://www.mulberrytech.com/dsssl/dssslist


Current Thread