Announcement

Collapse
No announcement yet.

Mit XSLT mehrere Ausgabedateien erzeugen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Mit XSLT mehrere Ausgabedateien erzeugen

    hi! ich versuche gerade, xslt zu verstehen )
    mein ziel ist es, quellcode aus einem xml-dokument zu erzeugen.
    dazu ist es notwendig, dass mehrere quelldateien ausgegeben werden.
    also ich hab etwa das dok "test.xml" und das stylesheet "test.xsl".
    rauskommen sollen "testMain.java", "testHelper.java" und "testIrgendwas.java"
    in allen Dateien werden Daten aus dem xml-File benötigt.
    Das Stylesheet regelt die Übersetzung in die einzelnen Ausgabedateien.

    Hat jemand Tips?

  • #2
    Moin,

    in der XSLT-Spezifikation 1.0 ist das Erzeugen von mehreren Ausgabedateien noch nicht implementiert worden.</br><br>

    Jedoch unterstützen verschiedene Prozessoren dieses Feature (beispielsweise Saxon, Xalan und Xt):</br></br>

    Hier ein kleines Beispiel:</br></br>

    <b><u>XML-Datei:</u></b></br></br>

    <?xml version="1.0" encoding="UTF-8"?></br>
    <root></br>
    <datei>test1</datei></br>
    <datei>test2</datei></br>
    <datei>test3</datei></br>
    </root></br>
    </br>
    </br>
    <b><u>Saxon-Beispiel:</u></b></br>

    <?xml version="1.0" encoding="UTF-8"?></br>
    <xsl:stylesheet version="1.0"</br>
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"</br>
    xmlns:saxon="http://icl.com/saxon"</br>
    extension-element-prefixes="saxon"></br>
    <xsl:template match="root"></br>
    <xsl:for-each select="datei"></br>
    <saxonutput href="{.}"></br>
    <test></br>
    <xsl:text>Testinhalt</xsl:text></br>
    </test></br>
    </saxonutput></br>
    </xsl:for-each></br>
    </xsl:template></br>
    </xsl:stylesheet></br></br>

    <b><u>XT-Beispiel:</u></b></br>

    <?xml version="1.0" encoding="UTF-8"?></br>
    <xsl:stylesheet version="1.0" </br>
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"</br>
    xmlns:xt="http://www.jclark.com/xt"</br>
    extension-element-prefixes="xt"></br>
    <xsl:template match="root"></br>
    <xsl:for-each select="datei"></br>
    <xt:document href="{.}"></br>
    <test></br>
    <xsl:text>Testinhalt</xsl:text></br>
    </test></br>
    </xt:document></br>
    </xsl:for-each></br>
    </xsl:template></br>
    </xsl:stylesheet></br></br>

    <b><u>Xalan-Beispiel:</u></b></br>
    <?xml version="1.0" encoding="UTF-8"?></br>
    <xsl:stylesheet version="1.0" </br>
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"</br>
    xmlns:xalan="org.apache.xalan.xslt.extensions.Redi rect"</br>
    extension-element-prefixes="xalan"></br>
    <xsl:template match="root"></br>
    <xsl:for-each select="datei"></br>
    <xalan:write select="."></br>
    <test></br>
    <xsl:text>Testinhalt</xsl:text></br>
    </test></br>
    </xalan:write></br>
    </xsl:for-each></br>
    </xsl:template></br>
    </xsl:stylesheet></br></br></br>

    <b><u>Ausgabe:</u></b>

    Es werden bei diesem Beispiel jeweils die drei Dateien test1, test2 und test3 mit folgendem Inhalt ausgegeben:</br></br>

    <test>Testinhalt</test></br></br>

    Die beiden Beispiele für den XT und Saxon-Prozessor habe ich getestet. Das Beispiel für den Xalan-Prozessor konnte ich noch nicht testen.</br></br>

    Hoffentlich konnte ich Dir weiterhelfen </br>

    C

    Comment


    • #3
      Hallo! <br>
      Zuerst mal Danke für den Tipp ) <br>
      Das Problem ist ein anderes. Ich benutze die XML-Datei, um eine Eingabesprache für einen Code-Generator zu schreiben. <br>
      In dieser Eingabedatei werden bestimmte Daten gespeichert, die beim Code-Generieren benötigt werden. Insgesamt werden über 10 Ausgabedateien
      erzeugt. In jeder dieser Ausgabedateien werden Daten aus dem XML-File benötigt (immer unterschiedlich). <br>

      Ich benutze XSLT, um die Daten aus dem XML-File in die Code-Schablonen einzufügen. D.h. Schablonencode und Übersetzungslogik finden für eine Ausgabedatei (etwa testMain.java) in einem XSL-Stylesheet platz.
      Meine Frage war nun, ob es möglich wäre, die Logik der XSL-Stylesheets so zu bauen, dass ich aus nur einem Stylesheet alle Ausgabe-Dateien bauen kann.

      Mittlerweile hab ich aber auch eine andere akzeptable Lösung gefunden.
      Ich definiere mir in XML ein sog. Master-Template, in dem alle Stylesheets einzeln aufgedführt sind.
      Damit kann ich in meinem Programm dann so viele transform()-Aufrufe in eine for-schleife bauen, wie es stylesheets gibt, und in jeder iteration das gerade betrachtete Stylesheet auf die XML-Datei anwenden. Damit erschlägt sich auch das Ausgabe-Problem ))

      Comment


      • #4
        Moin,

        Du könntest mit nur einem XSLT-Stylesheets alle Ausgabe-Dateien erzeugen.

        Mit Hilfe von XPath und XSLT kannst Du jeden Knoten im XML-Dokument beliebig oft ansprechen. Des Weiteren kannst Du die o. g. Ausgabeanweisungen ( beispielsweise <saxonutput href="{.}"> ... </saxonutput> ) an "fast" jeder Stelle im Stylesheet benutzen. Zu Beginn des Stylesheets könnten beispielsweise erst die Regeln zur Erzeugung der Datei "testMain.java" stehen und später folgen die Regeln zur Erzeugung der Datei "testHelper.java".

        Die oberen Listings sollten nur einfache Beispiele darstellen. Generell kannst Du die Ausgabebefehle beliebig oft im Stylesheet einsetzen

        Comment

        Working...
        X