Announcement

Collapse
No announcement yet.

Redundanter Inhalt bei der Erzeugung von Dateien

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

  • Redundanter Inhalt bei der Erzeugung von Dateien

    Hi,

    ich habe ein XML_Dokument und erzeuge, daraus n-Zieldateien.

    Vereinfacht ist der Code wie folgt aufgebaut:

    Code:
    <xsl:template name="create-new-page">
            <xsl:param name="globalData"/>
            <xsl:result-document href="{$filename}">
                <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ops="http://www.idpf.org/2007/ops">
                    <xsl:element name="head">
                        <xsl:element name="title">
                            <xsl:value-of
                                select="document('file:///c:/tmp/ops/OEBPS/meta.xml')//dc:title"/>
                        </xsl:element>
                        <link rel="stylesheet" type="text/css" href="styles.css"/>
                        <xsl:element name="body">                     
                            <xsl:element name="div">
                                <xsl:attribute name="id" select="content"/>
                                <xsl:attribute name="title" select="inhalt"/>
    <xsl:apply-templates select="descendant-or-self::node()">
                <xsl:with-param name="globalData" select="$globalData"/>
            </xsl:apply-templates>
            <xsl:apply-templates select="following-sibling::node()">
                <xsl:with-param name="globalData" select="$globalData"/>
            </xsl:apply-templates>
                            </xsl:element> 
                        </xsl:element>
                    </xsl:element>
                </html>
            </xsl:result-document>
        </xsl:template>
    Nun das Problem. Im Wesentlichen funktioniert alles. Aber leider wird in der 1 Datei der gesamte Inhalt der Quelldateien transformiert. Die 2. Datei hat dann den Inhalt der 2.Seiten bis zum Schluß usw.

    Ich habe die Templates Schritt für Schritt durch Laufen und den Fehler lokalisiert. Nach dem Erzeugen der letzten Datei werden die vorherigen Dateien abgeschlossen. So das die Datei der 1.Seiten die letzte Datei ist. Bei diesem "Rückwärtsgehen" ist mit auf gefallen, dass der jeweilige Knoten, der eigentlich mit <apply-templates select="descendant-or-self::node()> usw. in einer Extradatei gespeichert wurden. Auch in das vorhergehenden Dokument transformiert wird.

    Ein einfaches Beispiel: Die Überschrift "2.Seite" soll auf der 2.Seiten stehen. wird auch auch in der 1.Datei erzeugt.

    Existiert eine Möglichkeit ein Ende der Transformation der vorhergehenden Datei zu erzwingen. Oder wie muss ich das aufrufen.

    PS: Sollten in dem Codebeispiel Fehler auftreten, bitte dezent überlesen. Ich habe versucht, es vereinfacht darzustellen, denn das richtige template ist etwas komplexer.

    Gruß Jevo

  • #2
    Ohne den XML- und sonstigen Kontext sehe ich hier keinen Lösungsansatz.

    Ein Tipp: Verwende xsl:element und xsl:attribute nur dann, wenn sich Namen oder Inhalte dynamisch ergeben. Schreibe head, body und div genauso literal wie html und link! Neben besserer Performance wird auch der Code lesbarer.

    Comment


    • #3
      Hier die vereinfachte Quelldatei nach OpenDocument Format 1.1:


      Code:
      <office:document-content>
        <office:body>
            <office:text>
            <!--Hier kommt der Inhalt ähnlich wie bei XHTML-->
      <!--das ist die 1. Seite-->
      <text:p text:style-name="P4">FülltextFülltextFülltextFülltextFülltext</text:p>
      <!--der Inhalt der 2.Seiten ist hinter dem Element text:soft-page-break-->
      <text:p text:style-name="P4">FülltextFülltextFülltextFülltextFülltext
      <text:soft-page-break/>FülltextFülltextFülltextFülltextFülltext </text:p>
      <!--das ist die 3. Seite-->
      <text:p text:style-name="P5">FülltextFülltextFülltextFülltextFülltext
      <text:soft-page-break/> </text:p>
            </office:text>
        </office:body>
      </office:document-content>
      Dieses kurze Beispielquelldokument soll in 3 Dateien exportiert werden. Pro Seite ein Datei. Die Seitenumbrüche werden richtig erkannt und verarbeitet.

      Aber beim momentanen Ablauf ist das Resultat:

      Inhalt der 1. Datei = das komplette Quelldokument
      Inhalt der 2. Datei = das Quelldokument ab soft-page-break und der Inhalt der 3.Seiten
      Inhalt der 1. Datei = nur die 3.Seite

      wird ein Seitenumbruch gefunden, wird das Template create-new-page ausgeführt. Diese Template startet wieder alle Templates mit den nachfolgenden Knoten. Ich hoffe, dass hilft etwas weiter!

      Gruß Jevo

      Comment


      • #4
        Problem gelöscht. Ich setze ein Variable, wenn ich das Ende der Datei erreicht habe und überprüfe, bei jedem Aufruf, ob die Variable gesetzt ist! Es gibt bestimmte bessere Lösungen, aber bekanntlich führen viele Wege nach Rom.

        Gruß Jevo

        Comment

        Working...
        X