Announcement

Collapse
No announcement yet.

Nummerierung mit XSLT

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

  • Nummerierung mit XSLT

    Hallo, ich habe ein Problem mit der Überschriftengliederung in einem XML-Dokument:

    Ziel ist es eine dreistufige Gleiderung in der Form:

    1. Überschrift Ebene1
    1.1 Überschrift Ebene2
    1.2 Überschrift Ebene2
    2. Überschrift Ebene1
    2.1 Überschrift Ebene2
    2.2 Überschrift Ebene2
    2.2.1 Überschrift Ebene3
    2.2.2 Überschrift Ebene3
    2.3 Überschrift Ebene2

    Eigentlich ist das soweit nicht weiter schwer, doch es gibt ein kleines Problem mit der Struktur des XML-Files:

    So sieht die Struktur im Quelldokument aus:
    ------------------------------------------------

    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <gruppen>
    	<gruppenueberschrift>Gruppe A</gruppenueberschrift>
    	<gruppe>
    		<mitglied>a</mitglied>
    		<mitglied>b</mitglied>
    		<mitglied>c</mitglied>
    	</gruppe>
    	<gruppenueberschrift>Gruppe B</gruppenueberschrift>
    	<gruppe>
    		<mitglied>d</mitglied>
    		<mitglied>e</mitglied>
    		<mitglied>f</mitglied>
    	</gruppe>
    	<gruppenueberschrift>Gruppe C</gruppenueberschrift>
    	<gruppe>
    		<mitglied>g</mitglied>
    		<mitglied>h</mitglied>
    		<mitglied>i</mitglied>
    		<untergruppe>
    			<mitglied>j</mitglied>
    			<mitglied>k</mitglied>
    			<mitglied>l</mitglied>
    		</untergruppe>
    	</gruppe>
    </gruppen>
    Code:
    1. 	Gruppe A
    1.1 	a
    1.2 	b
    1.3 	c
    2. 	Gruppe B
    2.1 	d
    2.2 	e
    2.3 	f
    3. 	Gruppe C
    3.1	 g
    3.2 	h
    3.3 	i
    3.3.1	j
    3.3.2	k
    3.3.3	l
    <xsl:number count durchsucht die descendant-or-self-Achse.
    Die Überschrift zweiter Ebene befindet sich aber in <gruppe><mitglied> und wird daher nicht gefunden.

    Die Frage lautet also: Wie bekomme ich eine Gliederung der genannten Form, wenn die einzelnen Überschriften nicht ineinander verschachtelt sind, sondern auf den Geschwister-Achsen liegen.

    Wäre schön, wenn mal jemand eine Lösung hierfür posten könnte.
    Zuletzt editiert von JohannesW; 10.10.2007, 13:46.

  • #2
    gibt's schon Ideen?
    Zuletzt editiert von JohannesW; 10.10.2007, 14:25.

    Comment


    • #3
      Zeige mal den bisherigen XSLT-Code, dann lässt sich dieser ggf. anpassen.

      Comment


      • #4
        okay, das klingt ja schonmal sehr nett

        XML-File:
        Code:
        <?xml version="1.0" encoding="UTF-8"?>
        <gruppen>
        	<gruppenueberschrift>Gruppe A</gruppenueberschrift>
        	<gruppe>
        		<mitglied>a</mitglied>
        		<mitglied>b</mitglied>
        		<mitglied>c</mitglied>
        	</gruppe>
        	<gruppenueberschrift>Gruppe B</gruppenueberschrift>
        	<gruppe>
        		<mitglied>d</mitglied>
        		<mitglied>e</mitglied>
        		<mitglied>f</mitglied>
        	</gruppe>
        	<gruppenueberschrift>Gruppe C</gruppenueberschrift>
        	<gruppe>
        		<mitglied>g</mitglied>
        		<mitglied>h</mitglied>
        		<mitglied>i</mitglied>
        		<untergruppe>
        			<mitglied>j</mitglied>
        			<mitglied>k</mitglied>
        			<mitglied>l</mitglied>
        		</untergruppe>
        	</gruppe>
        </gruppen>
        Stylesheet:
        Code:
        <?xml version="1.0" encoding="UTF-8"?>
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
        	<xsl:output method="xml" version="1.0"/>
        	<!-- Seitenformat -->
        	<xsl:param name="Seitenbreite">210mm</xsl:param>
        	<xsl:param name="Seitenhoehe">297mm</xsl:param>
        	<xsl:param name="Raender-Testseite">20mm 10mm 20mm 25mm</xsl:param>
        	<xsl:param name="Innenraender-Testseite">0mm 0mm 0mm 0mm</xsl:param>
        	<xsl:template match="/">
        		<fo:root>
        			<fo:layout-master-set>
        				<fo:simple-page-master page-height="{$Seitenhoehe}" page-width="{$Seitenbreite}" margin="{$Raender-Testseite}" master-name="Testseite">
        					<fo:region-body margin="{$Innenraender-Testseite}"/>
        				</fo:simple-page-master>
        			</fo:layout-master-set>
        			<fo:page-sequence master-reference="Testseite">
        				<fo:flow flow-name="xsl-region-body">
        					<fo:block>
        						<xsl:apply-templates/>
        					</fo:block>
        				</fo:flow>
        			</fo:page-sequence>
        		</fo:root>
        	</xsl:template>
        	<xsl:template match="gruppen">
        		<xsl:apply-templates/>
        	</xsl:template>
        	<xsl:template match="gruppenueberschrift">
        		<fo:block font-size="24pt">
        			<xsl:number format="1. " count="gruppenueberschrift" level="multiple"/>
        			<xsl:value-of select="."/>
        		</fo:block>
        	</xsl:template>
        	<xsl:template match="gruppe/mitglied">
        		<fo:block font-size="16pt">
        			<xsl:number format="1.1 " count="gruppenueberschrift | gruppe/mitglied" level="multiple"/>
        			<xsl:value-of select="."/>
        		</fo:block>
        	</xsl:template>
        	<xsl:template match="gruppe/untergruppe/mitglied">
        		<fo:block>
        			<xsl:number format="1.1.1" count="gruppenueberschrift | gruppe/mitglied | untergruppe/mitglied" level="multiple"/>
        			<xsl:value-of select="."/>
        		</fo:block>
        	</xsl:template>
        </xsl:stylesheet>
        Ergebnis:

        Code:
        1. Gruppe A
        1 a
        2 b
        3 c
        2. Gruppe B
        1 d
        2 e
        3 f
        3. Gruppe C
        1 g
        2 h
        3 i
        1j
        2k
        3l

        Comment


        • #5
          Probiere es so (bei den dritten Stellen noch nicht ganz perfekt):

          Code:
            <xsl:template match="gruppen">
              <xsl:apply-templates/>
            </xsl:template>
            <xsl:template match="gruppenueberschrift">
              <fo:block font-size="24pt">
                <xsl:number format="1. " count="gruppenueberschrift" level="multiple"/>
                <xsl:value-of select="."/>
              </fo:block>
            </xsl:template>
            <xsl:template match="gruppe/mitglied">
              <fo:block font-size="16pt">
                <xsl:number format="1.1 " count="gruppe | mitglied" level="multiple"/>
                <xsl:value-of select="."/>
              </fo:block>
            </xsl:template>
            <xsl:template match="gruppe/untergruppe/mitglied">
              <fo:block font-size="14pt">
                <xsl:number format="1.1.1 " count="gruppe | untergruppe | mitglied" level="multiple"/>
                <xsl:value-of select="."/>
              </fo:block>
            </xsl:template>
          Ergebnis:

          1. Gruppe A
          1.1 a
          1.2 b
          1.3 c
          2. Gruppe B
          2.1 d
          2.2 e
          2.3 f
          3. Gruppe C
          3.1 g
          3.2 h
          3.3 i
          3.4.1 j
          3.4.2 k
          3.4.3 l

          Comment


          • #6
            Okay, danke mal soweit. Ich werd versuchen den Rest noch selbst zu lösen.

            Viele Grüße!

            Comment

            Working...
            X