sorosch: Gliederung erstellen

Hallo

ich möchte eine Gliederung mittels XML/XSL erstellen, die so aussieht:

A
Adobe
Auto
Apple

B
Baum
Berta
Busch
Bieber

D
Dach
Diesel

...usw.

Die Einträge selbst stehen in einem XML-File. Wenn es zu einem Buchstaben keine Einträge gibt, soll auch der Buchstabe nicht angezeigt werden.

Wie könnte man sowas machen? Probiere/Suche schon den ganzen Nachmittag im Internet. Aber nix gefunden.

Kann mir bitte jemand einen Tipp geben?

Vielen Dank
cu
George

  1. Hallo,

    ich möchte eine Gliederung mittels XML/XSL erstellen, die so aussieht:

    A
    Adobe

    ...

    ...usw.

    Die Einträge selbst stehen in einem XML-File. Wenn es zu einem Buchstaben keine Einträge gibt, soll auch der Buchstabe nicht angezeigt werden.

    Wie könnte man sowas machen? Probiere/Suche schon den ganzen Nachmittag im Internet. Aber nix gefunden.

    Erstens es hängt _alles_ davon ab wie dein XML-Datei aussieht.
    Du kannst dir trotzdem den Thread im Archiv: http://forum.de.selfhtml.org/archiv/2004/3/t74824/#m431224 durchlesen, dort ging es auch um eine ABC-Liste.

    Grüße
    Thomas

    --
    Surftip: kennen Sie schon Pipolino's Clowntheater?
    http://www.clowntheater-pipolino.net/
    1. Hi,

      Du kannst dir trotzdem den Thread im Archiv: http://forum.de.selfhtml.org/archiv/2004/3/t74824/#m431224 durchlesen, dort ging es auch um eine ABC-Liste.

      Btw: das Ding hab ich schon ein paarmal wieder als Grundlage genommen, um solche ABC-Listen zu bauen - Deine Hilfe hat sich also mehrfach gelohnt für mich!
      Vielen Dank nochmal dafür!

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      Schreinerei Waechter
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
      1. Hallo Andreas,

        Du kannst dir trotzdem den Thread im Archiv: http://forum.de.selfhtml.org/archiv/2004/3/t74824/#m431224 durchlesen, dort ging es auch um eine ABC-Liste.

        Btw: das Ding hab ich schon ein paarmal wieder als Grundlage genommen, um solche ABC-Listen zu bauen - Deine Hilfe hat sich also mehrfach gelohnt für mich!

        Das freut mich wirklich!

        Vielen Dank nochmal dafür!

        Gerngeschehen (nochmal ;-) )

        Grüße
        Thomas

        --
        Surftip: kennen Sie schon Pipolino's Clowntheater?
        http://www.clowntheater-pipolino.net/
  2. Wie könnte man sowas machen? Probiere/Suche schon den ganzen Nachmittag im Internet. Aber nix gefunden.

    Was hast Du denn bereits probiert? Der Nachmittag ist ja noch recht jung.

  3. Hallo

    ich habe das erst mal mit einer XML-Datei probiert, die so aussieht:

    <autoren>
    <autor>Helfa</autor>
    <autor>Berta</autor>
    <autor>Zappa</autor>
    <autor>PinkFloyd</autor>
    <autor>Affengeil</autor>
    <autor>Police</autor>
    <autor>Polizei</autor>
    <autor>Hügel</autor>
    <autor>Pizza</autor>
    <autor>Bieber</autor>
    <autor>Aberhallo</autor>
    </autoren>

    Dazu gefunden habe ich eine XSL, die aber fehlerhaft ist:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html" encoding="ISO-8859-1"             doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"             doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"             media-type="text/xml"/>
    <!-- Register nach Anfangsbuchstaben --> <xsl:template match="/">
    <html xml:lang="de" xmlns="http://www.w3.org/1999/xhtml">

    xsl:apply-templates/
    </html>
    </xsl:template>
    <xsl:template match="autoren">
    <head>
    <title>Autorenliste</title>
    </head>
    <body>

    <xsl:for-each select="autor">
    <xsl:sort select="."/>
    <xsl:call-template name="liste"/>
    </xsl:for-each>
    </body>

    </xsl:template>
    <xsl:template name="liste">
    <xsl:variable name="buchstabe">
    <xsl:value-of select="substring(.,1,1)"/>
    </xsl:variable>

    <br/>
    Wort: <xsl:value-of select="."/>
    Buchstabe: <xsl:value-of select="$buchstabe"/>
    <br/>

    <xsl:if test="$buchstabe != substring(preceding-sibling::autor[1],1,1)">

    neu
    <xsl:value-of select="$buchstabe"/>
    <br/>
    cc
    <xsl:value-of select="."/>
      </xsl:if>

    </xsl:template>
    </xsl:stylesheet>

    die macht leider so eine Ausgabe:

    A
    Aberhallo
    A
    Aberhallo
    Affengeil
    B
    Berta
    Bieber
    B
    Bieber
    H
    Helfa
    Hügel
    ...

    Es kommen Buchstaben mehrmals vor. Aber immerhin...

    Vielen Dank
    cu
    George

    1. Hallo,

      ich habe das erst mal mit einer XML-Datei probiert, die so aussieht:

      <data>
      <autoren>
      <autor>Helfa</autor>
      <autor>Berta</autor>
      <autor>Zappa</autor>
      <autor>PinkFloyd</autor>
      <autor>Affengeil</autor>
      <autor>Police</autor>
      <autor>Polizei</autor>
      <autor>Hügel</autor>
      <autor>Pizza</autor>
      <autor>Bieber</autor>
      <autor>Aberhallo</autor>
      </autoren>
      </data>

      Dazu gefunden habe ich eine XSL, die aber fehlerhaft ist:

      Hmm... sorry, aber so richtig verstehe ich dich nicht. Ich habe dir die Lösung schon gegeben, wenn du dabei was nicht verstehst hättest du du ruhig rückfragen können.

      Ich habe jetzt das Stylesheet was im verlinkten Archivthread vorhanden war hergenommen und in etwas 3 Minuten angepasst. Und auchwenn du sagt, "ja für dich ist das vielleicht leicht", hättest du auch kaum her als 10 Minuten dazu benötigt.

      Ich habe die translate() Funktion belassen, falls einmal ein Name doch kleingeschrieben wird. Wenn du das nicht brauchst, kannst du die funktion entfernen. Dann machst du überall aus dem
      translate(substring(., 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
      ein: substring(., 1, 1)
      Auf die Klammerung achten!

      Grüße
      Thomas

      -----------------------------
      <?xml version="1.0" encoding="iso-8859-1"?>
      <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:key name="firstletter" match="autor" use="translate(substring(., 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" />

      <xsl:template match="/data">
      <html>
      <head>
      <title>ABC-Liste</title>
      </head>

      <body>
      <xsl:apply-templates />
      </body>
      </html>
      </xsl:template>

      <xsl:template match="autoren">
      <xsl:call-template name="abclist" />
      <xsl:apply-templates select="autor" mode="byname">
        <xsl:sort select="."/>
      </xsl:apply-templates>
      </xsl:template>

      <xsl:template name="abclist">
      <xsl:for-each select="autor[generate-id() = generate-id(key('firstletter', translate(substring(., 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'))[1])]">
        <xsl:sort select="."/>
        <a href="#label{substring(., 1, 1)}"><xsl:value-of select="substring(.,1,1)"/></a>&#160;
        </xsl:for-each>
      </xsl:template>

      <xsl:template match="autor" mode="byname">
      <xsl:variable name="gruppe" select="key('firstletter', translate(substring(., 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'))" />
      <xsl:if test="generate-id(.) = generate-id(key('firstletter', translate(substring(., 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'))[1])">
        <h1><a id="label{substring($gruppe[1], 1, 1)}"><xsl:value-of select="substring($gruppe[1], 1, 1)" /></a></h1>
               <xsl:for-each select="$gruppe">
                <xsl:sort select="." />
         <p>
          <xsl:value-of select="." />
         </p>
        </xsl:for-each>
      </xsl:if>
      </xsl:template>
      </xsl:stylesheet>

      ------------------------------------------------------------------------

      Die Ausgabe ist:

      A  B  H  P  Z

      A
      Aberhallo
      Affengeil

      B
      Berta
      Bieber

      H
      Helfa
      Hügel

      P
      PinkFloyd
      Pizza
      Police
      Polizei

      Z
      Zappa

      1. Hallo Thomas,

        Vielen Dank erst mal für deine Hilfe. Aber ich verstehe echt fast nur Bahnhof. Ich mache seit ca. 1 Woche XML/XSL und bin froh, wenn eine normale Ausgabe funktioniert.... Aber da wird mit Funktionen/Keys gearbeitet - wusste gar nicht, dass es so viele Funktionen gibt.

        Ich dachte, dass die Lösung einfacher wäre und auf meine XML-Struktur leicht anpassbar ist.

        Meine XML-Strukut schaut so aus:

        <Datensatzbeschreibung>
        <Merkmalsgruppe>
          <GruppenUeberschrift>Datentechnische Merkmale</GruppenUeberschrift>
          <Merkmal>
           <Stelle_von>1</Stelle_von>
           <Stelle_bis>2</Stelle_bis>
           <Feldbezeichnung>
            <FeldName>SK</FeldName>
            <Feldformatierung/>
           </Feldbezeichnung>
           <Erlauterung>
            <Erl_Ueberschrift>Satzkennzeichen</Erl_Ueberschrift>
            <Erl_komplex>
             <Erl_Vorwort/>
             <Erl_Aufzaehlung>
              <Erl_Synonym>90</Erl_Synonym>
              <Erl_Beschreibung>statistik</Erl_Beschreibung>
             </Erl_Aufzaehlung>
             <Erl_Nachwort/>
            </Erl_komplex>
           </Erlauterung>
          </Merkmal>
          <Merkmal>
           <Stelle_von>3</Stelle_von>
           <Stelle_bis>6</Stelle_bis>
           <Feldbezeichnung>
            <FeldName>JA</FeldName>
            <Feldformatierung/>
           </Feldbezeichnung>
           <Erlauterung>
            <Erl_Ueberschrift>Berichtsjahr</Erl_Ueberschrift>
            <Erl_komplex>
             <Erl_Vorwort>Berichtsjahr in der Form JJJJ. zugänge des Jahres 2003.</Erl_Vorwort>
             <Erl_Aufzaehlung>
              <Erl_Synonym/>
              <Erl_Beschreibung/>
             </Erl_Aufzaehlung>
             <Erl_Nachwort/>
            </Erl_komplex>
           </Erlauterung>
          </Merkmal>
        </Merkmalsgruppe>
        <Merkmalsgruppe>
          <GruppenUeberschrift>Demographische Merkmale</GruppenUeberschrift>
          <Merkmal>
           <Stelle_von>19</Stelle_von>
           <Stelle_bis>22</Stelle_bis>
           <Feldbezeichnung>
            <FeldName>GBJAVS</FeldName>
            <Feldformatierung/>
           </Feldbezeichnung>
           <Erlauterung>
            <Erl_Ueberschrift>Geburtsjahr der Person</Erl_Ueberschrift>
            <Erl_komplex>
             <Erl_Vorwort>Geburtsjahr in der Form JJJJ</Erl_Vorwort>
             <Erl_Aufzaehlung>
              <Erl_Synonym>1938</Erl_Synonym>
              <Erl_Beschreibung>1938 und früher</Erl_Beschreibung>
             </Erl_Aufzaehlung>
             <Erl_Aufzaehlung>
              <Erl_Synonym>1944</Erl_Synonym>
              <Erl_Beschreibung>1944 - 1948</Erl_Beschreibung>
             </Erl_Aufzaehlung>
             <Erl_Aufzaehlung>
              <Erl_Synonym>1949</Erl_Synonym>
              <Erl_Beschreibung>1949 – 1953</Erl_Beschreibung>
             </Erl_Aufzaehlung>
             <Erl_Aufzaehlung>
              <Erl_Synonym>1954</Erl_Synonym>
              <Erl_Beschreibung>1954 – 1958</Erl_Beschreibung>
             </Erl_Aufzaehlung>
             <Erl_Aufzaehlung>
              <Erl_Synonym>1959</Erl_Synonym>
              <Erl_Beschreibung>1959 – 1963</Erl_Beschreibung>
             </Erl_Aufzaehlung>
             <Erl_Aufzaehlung>
              <Erl_Synonym>9999</Erl_Synonym>
              <Erl_Beschreibung>Geburtsjahr nicht bekannt</Erl_Beschreibung>
             </Erl_Aufzaehlung>
             <Erl_Nachwort/>
            </Erl_komplex>
           </Erlauterung>
          </Merkmal>
          <Merkmal>
           <Stelle_von>23</Stelle_von>
           <Stelle_bis>23</Stelle_bis>
           <Feldbezeichnung>
            <FeldName>GEVS</FeldName>
            <Feldformatierung/>
           </Feldbezeichnung>
           <Erlauterung>
            <Erl_Ueberschrift>Geschlecht der Person</Erl_Ueberschrift>
            <Erl_komplex>
             <Erl_Vorwort/>
             <Erl_Aufzaehlung>
              <Erl_Synonym>1</Erl_Synonym>
              <Erl_Beschreibung>männlich</Erl_Beschreibung>
             </Erl_Aufzaehlung>
             <Erl_Aufzaehlung>
              <Erl_Synonym>2</Erl_Synonym>
              <Erl_Beschreibung>weiblich</Erl_Beschreibung>
             </Erl_Aufzaehlung>
             <Erl_Nachwort/>
            </Erl_komplex>
           </Erlauterung>
          </Merkmal>
          <Merkmal>
           <Stelle_von>24</Stelle_von>
           <Stelle_bis>26</Stelle_bis>
           <Feldbezeichnung>
            <FeldName>SAVS</FeldName>
            <Feldformatierung/>
           </Feldbezeichnung>
           <Erlauterung>
            <Erl_Ueberschrift>Staatsangehörigkeit</Erl_Ueberschrift>
            <Erl_komplex>
             <Erl_Vorwort>Unterscheidung zwischen Deutschland und Ausland.</Erl_Vorwort>
             <Erl_Aufzaehlung>
              <Erl_Synonym>0</Erl_Synonym>
              <Erl_Beschreibung>Deutschland</Erl_Beschreibung>
             </Erl_Aufzaehlung>
             <Erl_Aufzaehlung>
              <Erl_Synonym>200</Erl_Synonym>
              <Erl_Beschreibung>Ausland</Erl_Beschreibung>
             </Erl_Aufzaehlung>
             <Erl_Aufzaehlung>
              <Erl_Synonym>999</Erl_Synonym>
              <Erl_Beschreibung>staatenlos / ungeklärt / unbekannt</Erl_Beschreibung>
             </Erl_Aufzaehlung>
             <Erl_Nachwort/>
            </Erl_komplex>
           </Erlauterung>
          </Merkmal>
        </Merkmalsgruppe>
        </Datensatzbeschreibung>

        Gliederung soll jeweils nach "FeldName" erfolgen. Wenn ich die XSL-Datei "entsprechend" anpasse, wird alles durcheinander ausgegeben. Kann man solch eine Struktur überhaupt gliedern? Oder muss alles in einem Tag stehen, nach dem gegliedert werden soll? Entschuldige, dass ich nicht gleich die "richtige" Struktur gepostet habe. Aber ich dachte, dass ich die selbst anpassen könnte??? Könntest du mir bitte nochmal helfen? Oder muss da das XSL komplett anders aussehen?

        Vielen Dank und einen schönen Abend
        cu
        George

        Hallo,

        ich habe das erst mal mit einer XML-Datei probiert, die so aussieht:

        <data>
        <autoren>
        <autor>Helfa</autor>
        <autor>Berta</autor>
        <autor>Zappa</autor>
        <autor>PinkFloyd</autor>
        <autor>Affengeil</autor>
        <autor>Police</autor>
        <autor>Polizei</autor>
        <autor>Hügel</autor>
        <autor>Pizza</autor>
        <autor>Bieber</autor>
        <autor>Aberhallo</autor>
        </autoren>
        </data>

        Dazu gefunden habe ich eine XSL, die aber fehlerhaft ist:

        Hmm... sorry, aber so richtig verstehe ich dich nicht. Ich habe dir die Lösung schon gegeben, wenn du dabei was nicht verstehst hättest du du ruhig rückfragen können.

        Ich habe jetzt das Stylesheet was im verlinkten Archivthread vorhanden war hergenommen und in etwas 3 Minuten angepasst. Und auchwenn du sagt, "ja für dich ist das vielleicht leicht", hättest du auch kaum her als 10 Minuten dazu benötigt.

        Ich habe die translate() Funktion belassen, falls einmal ein Name doch kleingeschrieben wird. Wenn du das nicht brauchst, kannst du die funktion entfernen. Dann machst du überall aus dem
        translate(substring(., 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
        ein: substring(., 1, 1)
        Auf die Klammerung achten!

        Grüße
        Thomas


        <?xml version="1.0" encoding="iso-8859-1"?>
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:key name="firstletter" match="autor" use="translate(substring(., 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')" />

        <xsl:template match="/data">
        <html>
        <head>
        <title>ABC-Liste</title>
        </head>

        <body>
        <xsl:apply-templates />
        </body>
        </html>
        </xsl:template>

        <xsl:template match="autoren">
        <xsl:call-template name="abclist" />
        <xsl:apply-templates select="autor" mode="byname">
          <xsl:sort select="."/>
        </xsl:apply-templates>
        </xsl:template>

        <xsl:template name="abclist">
        <xsl:for-each select="autor[generate-id() = generate-id(key('firstletter', translate(substring(., 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'))[1])]">
          <xsl:sort select="."/>
          <a href="#label{substring(., 1, 1)}"><xsl:value-of select="substring(.,1,1)"/></a>&#160;
          </xsl:for-each>
        </xsl:template>

        <xsl:template match="autor" mode="byname">
        <xsl:variable name="gruppe" select="key('firstletter', translate(substring(., 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'))" />
        <xsl:if test="generate-id(.) = generate-id(key('firstletter', translate(substring(., 1, 1), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'))[1])">
          <h1><a id="label{substring($gruppe[1], 1, 1)}"><xsl:value-of select="substring($gruppe[1], 1, 1)" /></a></h1>
                 <xsl:for-each select="$gruppe">
                  <xsl:sort select="." />
           <p>
            <xsl:value-of select="." />
           </p>
          </xsl:for-each>
        </xsl:if>
        </xsl:template>
        </xsl:stylesheet>


        Die Ausgabe ist:

        A  B  H  P  Z

        A
        Aberhallo
        Affengeil

        B
        Berta
        Bieber

        H
        Helfa
        Hügel

        P
        PinkFloyd
        Pizza
        Police
        Polizei

        Z
        Zappa

        1. Hallo Thomas,

          ich habe keine Ahnung - aber so wies gerade aussieht, geht es:))) Vielleicht auch nur, weil ich Feierabend machen möchte. Wenn es morgen früh noch gehen sollte, bekommst du ein ganz dickes Bussi... Frag nicht warum es geht - schaue es mir morgen ganz in Ruhe an - werde ich zwar eh nicht verstehen - aber mal schauen.

          Vielen vielen Dank nochmal und noch einen wunderschönen Abend

          cu
          George

        2. Hallo,

          Vielen Dank erst mal für deine Hilfe. Aber ich verstehe echt fast nur Bahnhof. Ich mache seit ca. 1 Woche XML/XSL und bin froh, wenn eine normale Ausgabe funktioniert.... Aber da wird mit Funktionen/Keys gearbeitet - wusste gar nicht, dass es so viele Funktionen gibt.

          Wenn du was nicht verstehst, kannst du ja - wie gesagt - ruhig nachfragen. Das ist nun wirklich kein Problem.

          Ich dachte, dass die Lösung einfacher wäre und auf meine XML-Struktur leicht anpassbar ist.

          Meine XML-Strukut schaut so aus:

          Nun, die ist ja ein "wenig" anderes, als das Beispiel ;-)

          Gliederung soll jeweils nach "FeldName" erfolgen. Wenn ich die XSL-Datei "entsprechend" anpasse, wird alles durcheinander ausgegeben. Kann man solch eine Struktur überhaupt gliedern?

          Ja, klar geht das.

          Oder muss alles in einem Tag stehen, nach dem gegliedert werden soll? Entschuldige, dass ich nicht gleich die "richtige" Struktur gepostet habe. Aber ich dachte, dass ich die selbst anpassen könnte??? Könntest du mir bitte nochmal helfen? Oder muss da das XSL komplett anders aussehen?

          Wenn jetzt mit deiner Anpassungen alles so funktioniert wie gewünscht, ist alles in Ordnung. Falls doch noch Fragen auftauchen, das Forum ist immer geöffent. ;-)
          (Aber in dem fall, muss du auch etwas über die gewollte Ausgabe sagen, denn - und davon gehe ich aus - nach deinem XML zu schließen brauchst du in der Ausgabe mehr als nur eine ABC-Liste)

          Grüße
          Thomas

          --
          Surftip: kennen Sie schon Pipolino's Clowntheater?
          http://www.clowntheater-pipolino.net/
  4. Hallo Thomas,

    ich bedanke mich nochmals recht herzlich. Es funktioniert!! Auch anpassen konnte ich das "Design" und in meinem XSL einbauen. Auf jedenfall weiß ich jetzt, dass XSL mehr ist, als ich dachte...

    Jetzt kommt als nächste Aufgabe die Erstellung eines PDF.... Ohh jee

    Ich denke, da wirds noch schlimmer...

    Noch einen schönen Tag
    cu
    George