frage: <fo:page-number-citation ref-id="{generate-id()}"/> geht nicht

Hallo, kann mir jemand helfen? Mache in meinem Inhaltsverzeichnis Seitennummern und  zwar soll die nummer über <fo:block id="{generate-id()}"/> eindeutig sein. Die Ausgabe will ich dann mit <fo:page-number-citation ref-id="{generate-id()}"/> machen, allerdings weil beides in einer Schleife geschehen soll (oder vielleicht nicht deswegen) bekomme ich die Fehlermeldung: [ERROR] org.apache.fop.apps.FOPException: The id "N1000F" already exists in this document
und zwar wegen <fo:block id="{generate-id()}"/> in der Schleife. Außerhalb der Schleife funktioniert es, muss aber in der Schleife sein.. Kann mir da jemand helfen?

  1. Hallo,

    Kann mir da jemand helfen?

    Nicht ohne ein wenig mehr über deine "Schleifen" zu wissen.

    Grüße
    Thomas

    1. Dürfte ich vielleicht Ihnen das ganze an die Mail-Adresse schicken? Es ist passt hier leider alles nicht rein..

      Hallo,

      Kann mir da jemand helfen?

      Nicht ohne ein wenig mehr über deine "Schleifen" zu wissen.

      Grüße
      Thomas

      1. Hallo,

        Dürfte ich vielleicht Ihnen

        Hier ist man per "Du" ;-)

        das ganze an die Mail-Adresse schicken? Es ist passt hier leider alles nicht rein..

        Das ist relativ schlecht (auch wenn ich den Grund der Frage verstehe), da ich dann erst irgedwann heute Nacht oder Morgen antworten könnte und vor allem weil dann andere, die vielleicht das gleiche oder ein änliches Problem haben, die Antwort / Lösung später nicht im Archiv finden werden.

        Versuche den Teil auf das wesentliche zu reduzieren:
        wie machst du deine "Schleife": mit xsl:for-each, oder xsl:apply-templates ?
        Wie versuchst du die Referenzierung zu erreichen?

        "<fo:block id="{generate-id()}"/> eindeutig sein. Die Ausgabe will ich dann mit <fo:page-number-citation ref-id="{generate-id()}"/> machen"

        In beiden Fällen wird für das current-Element eine ID generiert, wenn du also zwei Schleifen hast die jeweils andere Elemente Selektieren, greift geenrate-id() eh nicht.
        Die Fehlermeldung:
        " [ERROR] org.apache.fop.apps.FOPException: The id "N1000F" already exists in this document"
        lässt aber vermuten, dass du irgendwo ein und dasselbe Element mehrmals im Ergebnisdokument hast. D.h. irgendwo hast du (möglichweise verschidene) Templates oder Schleifen, die aber ein und dasselbe Element an verschiedene Stellen ausgeben.

        Grüße
        Thomas

        PS: bei Mail muss du wirklich warten.

        1. alles klar, tut mir leid, habe dir schon was geschickt, aber hier kommt die zusammengefasste fassung:

          <xsl:template name="INHALTSVERZEICHNIS">
          <xsl:for-each select="//gesellschaft">
           <xsl:variable name="gesellschaft" select="."/>
            <xsl:for-each select="//stellen/stelle">
             <xsl:variable name="stelle" select="."/>
              fo:table
              <fo:table-column column-width="140mm"/>
              <fo:table-column column-width="20mm"/>
               fo:table-header
                fo:table-row
                 fo:table-cell
                  <fo:block font-size="11pt" space-after.optimum="8pt"><xsl:value-of select="$stelle/titel" /> /fo:block>
                 </fo:table-cell>
                 fo:table-cell
          <!-- HIER SOLLTE EIGENTLICH DIE AUSGABE DER SEITENNUMMER ERFOLGEN, ABER.. :(
                  <fo:block font-size="11pt" space-after.optimum="8pt" text-align="end"><fo:page-number-citation ref-id="{generate-id()}"/></fo:block>
                 </fo:table-cell>
                </fo:table-row>
               </fo:table-header>
               fo:table-body
               </fo:table-body>
              </fo:table>
            </xsl:for-each>
           </xsl:for-each>
          </xsl:template>

          <xsl:template name="STELLE">
           <!-- Ausgabe: STELLE -->
           <xsl:for-each select="//stellen/stelle">
            <xsl:variable name="stelle" select="."/>
             <xsl:value-of select="@id"/>
              <xsl:for-each select="//gesellschaft[@id=$stelle/@idref]">
               <xsl:variable name="gesellschaft" select="."/>

          <!-- IN DIESEM BLOCK WIRD DIE ID GENERIERT, UND HIER KOMMT AUCH DIE FEHLERMELDUNG -->
                   <!-- Ueberschrift der Tabelle -->
               <fo:block id="{generate-id()}"><xsl:value-of select="$stelle/titel" /></fo:block>

          fo:table
                <fo:table-column column-width="55mm"/>
                <fo:table-column column-width="100mm"/>
                 fo:table-header
                 </fo:table-header>
                 fo:table-body
                  <fo:table-row keep-with-next="always">
                   <fo:table-cell /> <!-- leere Zeile -->
                  </fo:table-row>
                  fo:table-row
                   fo:table-cell
                   <fo:block font-size="11pt" font-weight="bold" space-before.optimum="20pt">bla:</fo:block>
                   </fo:table-cell>
                   fo:table-cell
                   <fo:block font-size="11pt" font-weight="bold" space-before.optimum="20pt">blabla </fo:block>
                   </fo:table-cell>
                  </fo:table-row>
                 </fo:table-body>
                </fo:table>
            </xsl:for-each>
           </xsl:for-each>
          </xsl:template>

          irgendwie weiß ich nicht, was falsch ist.. :(

          1. Hallo,

            alles klar, tut mir leid, habe dir schon was geschickt,

            Ja, habe ich erhalten.
            Bitte erlaube dazu eine Bemerkung, ist aber nicht böse gemeint: du solltest bald möglichst dich mit der Möglichkeiten von <xsl:template match="" mode=""> beschäftigen. Jetzt wirst wohl deine Templates nicht mehr (oder eben nur sehr schwer) ändern können (nehme an hast auch Zeitdruck), aber sie bergen ein großes Optimierungspotenzial.

            Versuche es an beiden Stellen generate-id($gesellschaft) zu benützen.

            »»irgendwie weiß ich nicht, was falsch ist.. :(

            ich habe hier dei Templates auf die Problemstellen gekürzt:

            <xsl:for-each select="//stellen/stelle[position() > 1]">
            <!-- HIER SOLLTE EIGENTLICH DIE AUSGABE DER SEITENNUMMER ERFOLGEN, ABER.. :( -->
             <fo:block font-size="11pt" space-after.optimum="8pt" text-align="end"><fo:page-number-citation ref-id="{generate-id()}"/></fo:block>
            </xsl:for-each>

            hier wird eigentlich eine ID für "stelle" generiert.

            <xsl:for-each select="//gesellschaften/gesellschaft[@id=$stelle/gesellschaft/@idref]">
            <!-- IN DIESEM BLOCK WIRD DIE ID GENERIERT, UND HIER KOMMT AUCH DIE
            FEHLERMELDUNG -->
             <fo:block id="{generate-id()}">
             <xsl:value-of select="$stelle/titel" />
             </fo:block>
            </xsl:for-each>

            und hier für "gesellschaft"

            Grüße
            Thomas

            1. Hallo Thomas,

              vielen Dank für die Hilfe, alles klappt wunderbar!!

              Ich weiss, ich sollte es nicht machen, aber ich habe dir noch eine kleine Frage an die Mail geschickt, aber ich wiederhole es hier nochmal für alle:

              Ich habe jetzt allerdings ein anderes Problem: Ich habe in der XML folgendes:

              <test>
              bla
              bla

              bla
              </test>

              als Ausgabe bekomme ich dann
              bla bla bla bla

              möchte aber die genau oben gezeigte Struktur beibehalten:

              bla
              bla

              bla

              Ich habe schon im Archiv nachgeschaut
              und von Dir dann folgenden Vorschlag zu dem Thema gefunden:
              <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
              <xsl:preserve-space elements="Baustein" />

              <!-- andere xsl-elemente etc. -->
              <xsl:template match="Baustein">
               <fo:block linefeed-treatment="preserve">
                <xsl:value-of select="" />
               </fo:block>
              </xsl:template>
              </xsl:stylesheet>

              Das funktioniert aber nicht bei mir.. :( Hättest Du vielleicht Rat?

              1. Hallo,

                vielen Dank für die Hilfe, alles klappt wunderbar!!

                Da freut man sich ;-)

                Ich habe jetzt allerdings ein anderes Problem: Ich habe in der XML folgendes:

                <test>
                bla
                bla

                bla
                </test>

                als Ausgabe bekomme ich dann
                bla bla bla bla

                möchte aber die genau oben gezeigte Struktur beibehalten:

                Das funktioniert aber nicht bei mir.. :( Hättest Du vielleicht Rat?

                <fo:block white-space-collapse="false">

                Das macht unter FOP genau was du möchtest.

                Grüße
                Thomas

                1. Also echt, ich weiss nicht, was ich die letzten Tage ohne dich getan hätte.. danke, vielen dank!! Habe so lange daran gesessen..

                  <fo:block white-space-collapse="false">

                  Das macht unter FOP genau was du möchtest.

                  Grüße
                  Thomas