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> 
</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
AffengeilB
Berta
BieberH
Helfa
HügelP
PinkFloyd
Pizza
Police
PolizeiZ
Zappa