Re: [xsl] many to one OR one to many?

Subject: Re: [xsl] many to one OR one to many?
From: Fabien Triolet <fabien.triolet@xxxxxxxxxxxx>
Date: Thu, 03 Apr 2003 07:03:51 +0200
I'm writing the documentation for a tool called Transmorpher and my aim
is to generate a web output (html) and a pdf output  ( for  printing ).

The manual can be described as :

a file (book.xml)

<!DOCTYPE book [
<!ENTITY introduction SYSTEM "intro.xml">
<!ENTITY examples SYSTEM "examples.xml">

]><book>

 &introduction;
 &examples;
....
</book>

that contains others files (chapter) :

<chapter>
 <title>Introduction</title>
  <sect1>
   <title>test</title>
   <para>blablabla</para>
   ...
  </sect1>
 ...
</chapter>

I am using Transmorpher (http://transmorpher.inrialpes.fr) to generate
both html and pdf outputs.
Transmorpher required a file which contains the description of the
transformations to apply on the input files.

For the generation of the documentation, I've created the following
process :

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE transmorpher SYSTEM
"http://transmorpher.inrialpes.fr/dtd/transmorpher.dtd";>

<transmorpher    name="Livre" version="1.0"
xmlns="http://transmorpher.fluxmedia.fr/1.0";>

    <defextern name="dir"
class="fr.fluxmedia.transmorpher.stdlib.FileIterator"/>
    <defextern name="fop"
class="fr.fluxmedia.tmcontrib.serializer.PDFSerializer"/>


<main name="MyDoc">


<param name="path">../samples</param>

       <generate id="generateXML" type="readfile" out="1">
            <with-param
name="file">${path}/livre/refman/input/Livre.xml</with-param>
        </generate>

<dispatch id="disp" type="broadcast" in="1" out="11 12 13"/>

        <apply-external id="red" in="11" out="2" type="xslt">
            <with-param
name="file">${path}/livre/refman/xslt/LivreFO.xsl</with-param>
        <with-param name="path1">$path</with-param>
        </apply-external>

        <!-- <dispatch id="disp" type="broadcast" in="2" out="3 4"/> -->
        <serialize id="output" type="fop" in="2">
            <with-param
name="file">${path}/livre/refman/output/pdf/refman.pdf</with-param>
            <with-param name="format">pdf</with-param>
        </serialize>

        <!-- <serialize id="output" type="writefile" in="4">
            <with-param
name="file">../samples/livre/output/livre.fo</with-param>
            <with-param name="method">xml</with-param>
            <with-param name="indent">yes</with-param>
        </serialize> -->

        <apply-external id="red" in="12" out="3" type="xslt">
            <with-param
name="file">${path}/livre/refman/xslt/LivreHTML.xsl</with-param>
        </apply-external>

        <serialize id="output" type="writefile" in="3">
            <with-param
name="file">${path}/livre/refman/output/html/index.html</with-param>
            <with-param name="method">html</with-param>
            <with-param name="indent">yes</with-param>
        </serialize>

<repeat id="rep" in="13" bin="OO" out="OO">

        <with-param name="path1">$path</with-param>
            <!-- gets all the xml files in chapters/ . At each loop, a
parameter "name" is given to
            the processes that are in the repeat body. The value of this
parameter is the current file name.-->
          <iterate type="dir" name="name">
                <with-param
name="dir">../samples/livre/refman/input/chapters</with-param>
                <with-param name="filter">xml</with-param>
                <with-param name="recursive">no</with-param>
                <with-param name="sort">true</with-param>
            </iterate>

        <!-- Due to the current implementation of the repeat component,
repeat can' t be created without
        input and output. The following process is added to allow the
creation of this repeat-->

        <apply-external id="red" in="13" out="OO" type="xslt">
            <with-param
name="file">${path1}/livre/refman/xslt/chapitreHTML.xsl</with-param>
        </apply-external>

        <!-- useful part of the repeat process : transforms all the xml
files in html files -->
        <!-- reads the current file -->
        <generate id="generateXML" type="readfile" out="O1">
            <with-param name="file">$name</with-param>
        </generate>

        <apply-external id="red" in="O1" out="O2" type="xslt">
            <with-param
name="file">${path1}/livre/refman/xslt/chapitreHTML.xsl</with-param>
        </apply-external>

        <serialize id="output" type="writefile" in="O2">
            <with-param
name="file">${path1}/livre/refman/output/html/${name}</with-param>
            <with-param name="method">xml</with-param>
            <with-param name="format">html</with-param>
            <with-param name="standalone">no</with-param>
            <with-param name="encoding">iso-8859-1</with-param>
            <with-param name="indent">yes</with-param>
        </serialize>
        </repeat>

        <!-- The output of the repeat is useless. So we don't write
anything-->
        <serialize id="output" type="writefile" in="OO" file="_null_">
        </serialize>

    </main>
</transmorpher>

to process the transformation, just type :
java -jar PATHTOTRANSMORPHER/lib/transmo.jar process.xml

Transmorpher is provided with some examples. See the music-collection
sample in which one xml source file
is cut into several files.

Fabien TRIOLET
--------------------------
INRIA Rhone-Alpes, FRANCE



XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list


Current Thread