Announcement

Collapse
No announcement yet.

xsl:number referenzieren

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

  • xsl:number referenzieren

    Hallo,

    in einem xslt Stylsheet (erzeugt xsl-fo) möchte ich Abbildungs- und Tabellennummern referenzieren. Zwar habe ich keine Probleme, mittels key Element und Funktion den Inhalt von entsprechend attributierten Elementen in der Instanz zu referenzieren; hier jedoch wird die Augabe durch xsl:number erzeugt und direkt in die fo-Ausgabe geschrieben.

    Wisst ihr einen Weg, diese Nummern zu referenzieren? Mir dämmert, dass ich das in fo machen muss ... aber wie?

    Danke!

    Edit:

    Ok, ich habe im Stylesheet ein inline Element definiert, das die entsprechende ID des Abbildungselementes bekommt und die Abbildungsnummer enthält:

    Ergebnis z.B.

    <fo:inline id="ref1">1</fo:inline>

    Ich stehe hier völlig auf dem Schlauch: Wie zitiere ich dieses Element?
    Zuletzt editiert von Joshua; 18.04.2011, 12:09.

  • #2
    Was willst du zitieren, die id "ref1" oder den Inhalt "1"? Und wo willst du zitieren? Wie sieht der XSLT-Code genau aus? Wenn der Inhalt "1" durch xsl: number erzeugt wird und die willst diese Nummer auch an anderer Stelle erzeugen, dann eventuell, indem du die selben Knoten in einem anderem "mode" verarbeitest und dann einfach wieder xsl: number verwendest.

    Comment


    • #3
      Originally posted by Martin Honnen View Post
      Was willst du zitieren, die id "ref1" oder den Inhalt "1"?
      Den Inhalt, also die '1'.

      Originally posted by Martin Honnen View Post
      Und wo willst du zitieren?
      Durch ein entsprechendes Template innerhalb des FO-Outputs.

      Originally posted by Martin Honnen View Post
      Wie sieht der XSLT-Code genau aus?
      Innerhalb meines 'absatz' Templates, das im Element 'abbildung' aufgerufen wird, steht ausschnittweise:
      Code:
      <xsl:element name="fo:inline">
      	<xsl:attribute name="id">
      		<xsl:value-of select="ancestor::abbildung/@ref" />
      	</xsl:attribute>
      	<xsl:number level="any" count="abbildung[@nummer='nummer']" from="ba" format="1"/>
      </xsl:element>
      Das erzeugt mir halt das inline-Element mit der richtigen ID.

      Originally posted by Martin Honnen View Post
      Wenn der Inhalt "1" durch xsl: number erzeugt wird und die willst diese Nummer auch an anderer Stelle erzeugen, dann eventuell, indem du die selben Knoten in einem anderem "mode" verarbeitest und dann einfach wieder xsl: number verwendest.
      Ja, das denke ich auch. XPATH finde ich recht kompliziert, und hier komme ich nicht drauf, wie ich es machen könnte. Die Nummer müsste in einem anderen Template (für ein 'referenz' Element) reproduziert werden. Da ich das nicht kann, dachte ich an eine alternative, einfachere Lösung.

      Comment


      • #4
        Mein Vorschlag ist
        Code:
        <xsl:template match="foo" mode="image-number">
          <xsl:number level="any" count="abbildung[@nummer='nummer']" from="ba" format="1"/>
        </xsl:template>
        dann
        Code:
        <xsl:element name="fo:inline">
        	<xsl:attribute name="id">
        		<xsl:value-of select="ancestor::abbildung/@ref" />
        	</xsl:attribute>
        	<xsl:apply-templates select="." mode="image-number"/>
        </xsl:element>
        und an anderer Stelle
        Code:
          <xsl:apply-templates select="//foo" mode="image-number"/>
        Das match="foo" bzw. select="//foo" muss natürlich deinem XML-Dokument angepasst werden, d.h. es muss der entsprechende Elementname bzw. Pfad verwendet werden. Wenn du bei der Formulierung des Pfades Hilfe brauchst, dann zeige uns einen Auszug aus dem XML, so dass man die relevanten Elemente und ihr Verhältnis zu einander sehen kann.

        Comment


        • #5
          Warum wird das Element fo:inline so umständlich erzeugt? So ist das les- und wartbarer:

          Code:
          <fo:inline id="{ancestor::abbildung/@ref}">
            <xsl:apply-templates select="." mode="image-number"/>
          </fo:inline>

          Comment


          • #6
            Hm, das kann eigentlich nicht funktionieren. foo wäre ja dann die Referenz, und die würde wohl einfach nur die Zahl an aktuellen und nummerierten Abbildungen ausgeben (Das Attribut nummer weist der Abbildung eine nummerierte Bildunterschrift zu).

            Soll eine Abbildung zitiert werden, so vergebe ich ein Attribut ref. Ich muss also wissen, wieviele nummerierte Abbildungen es bis zum Match mit dem richtigen ref gab.

            Beispiel:

            <abbildung nummer='nummer' ref='zitiermich'>
            <grafik ... />
            <absatz>Ich bin die Bildunterschrift</absatz>
            </abbildung>

            <doku>
            ...
            <ba>
            <kapitel ...>
            <titel />
            <absatz>In Abbildung <referenz ref='zitiermich' /> ist gezeigt, ...</absatz>

            usw.

            Comment


            • #7
              Originally posted by Thomas Meinike View Post
              So ist das les- und wartbarer:
              Stimmt.....

              Comment


              • #8
                Ich hab's zwischenzeitlich mit folgendem probiert:

                <xsl:number level="any" count="abbildung[@nummer='nummer']" from="ba" format="1"/>

                Das ist die Zahl der nummerierten Abbildungen.

                <xsl:number level="any" count="abbildung[@nummer='nummer']" from="ba/*/abbildung[@ref='testref']" format="1"/>

                Das ist die Zahl von nummerierten Abbildungen seit der Abbildung mit der Referenz 'testref'.

                Die Differenz plus 1 gibt dann die richtige Abbildungsnummer. Leider funktioniert das nur für zurückliegende Abbildungen. Was wäre die Herangehensweise, um über alle Abbildungen zu iterieren, am Ende also auch nachfolgende Abbildungen referenzieren zu können?

                Sorry, ich bin da wirklich ein Vollhonk. XSLT überschreitet meine Grenzen .

                Comment

                Working...
                X