xslt < Sonstiges < Hochschule < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 23:05 Mo 03.12.2007 | Autor: | Bastiane |
Aufgabe | c) Schreibe ein XSLT-Stylesheet lib-c.xsl, das Autoren und die Anzahl ihrer Bücher (als Balkendiagramm) auflistet. Sortiert wird dabei nach Anzahl der Bücher, die ein Autor geschrieben hat (größte Zahl zuerst). Außerdem sollen nur die ersten drei Autoren in
dieser Rangliste ausgegeben werden. Format:
Pratchett, Terry ####################################
Banks, Iain M. ###########
Rowling, Joanne K. ####### |
Hallo noch ein vorerst letztes Mal!
Bei obiger Aufgabe habe ich immerhin schon geschafft, für jedes Buch hinter den Autornamen ein # zu schreiben:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:template match="book-list">
<xsl:for-each-group select="book" group-by="author">
<xsl:apply-templates select="author"/>
<xsl:for-each select="current-group()">
<xsl:text>#</xsl:text>
</xsl:for-each>
<xsl:text>
</xsl:text>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
Nun habe ich aber zwei Probleme:
1.) Wie bekomme ich das so eingerückt, dass die jeweils ersten Rauten untereinander stehen? Gibt es da irgendwas, womit ich sagen kann, dass das an der so und so vielten Stelle hinsoll? Irgendwie habe ich da gar keine Idee, wie man das machen könnte.
2.) Wie gebe ich nachher nur die ersten 3 raus? Im Moment gibt er mir ja alles aus. Irgendwie muss ich ja "zählen", wieviele #'s es gibt, und dann muss ich halt die 3 größten ausgeben, aber auch nur die. Also habe ich einmal das Problem, sie zu zählen, dann, die ersten 3 davon zu bestimmen, und als letztes noch, nur diese auszugeben.
Hat da jemand eine Idee?
Viele Grüße
Bastiane
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 00:52 Di 04.12.2007 | Autor: | rainerS |
Hallo Bastiane!
> c) Schreibe ein XSLT-Stylesheet lib-c.xsl, das Autoren und
> die Anzahl ihrer Bücher (als Balkendiagramm) auflistet.
> Sortiert wird dabei nach Anzahl der Bücher, die ein Autor
> geschrieben hat (größte Zahl zuerst). Außerdem sollen nur
> die ersten drei Autoren in
> dieser Rangliste ausgegeben werden. Format:
>
> Pratchett, Terry ####################################
> Banks, Iain M. ###########
> Rowling, Joanne K. #######
> Hallo noch ein vorerst letztes Mal!
>
> Bei obiger Aufgabe habe ich immerhin schon geschafft, für
> jedes Buch hinter den Autornamen ein # zu schreiben:
>
> <xsl:stylesheet version="2.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
> <xsl:output method="text" indent="yes"/>
>
> <xsl:template match="book-list">
> <xsl:for-each-group select="book" group-by="author">
> <xsl:apply-templates select="author"/>
> <xsl:for-each select="current-group()">
> <xsl:text>#</xsl:text>
> </xsl:for-each>
> <xsl:text>
> </xsl:text>
> </xsl:for-each-group>
> </xsl:template>
> </xsl:stylesheet>
>
> Nun habe ich aber zwei Probleme:
>
> 1.) Wie bekomme ich das so eingerückt, dass die jeweils
> ersten Rauten untereinander stehen? Gibt es da irgendwas,
> womit ich sagen kann, dass das an der so und so vielten
> Stelle hinsoll? Irgendwie habe ich da gar keine Idee, wie
> man das machen könnte.
Du kannst geschickt Funktionen benutzen. Zum Beispiel:
<xsl:value-of select="count(current-group())"/>
gibt dir die Anzahl der Elemente der aktuellen Gruppe aus (also die Anzahl der #), oder
<xsl:sort select="count(current-group())"/>
Mit max(string-length(author)) bekommst du die Länge des längsten author-Elements.
> 2.) Wie gebe ich nachher nur die ersten 3 raus? Im Moment
> gibt er mir ja alles aus. Irgendwie muss ich ja "zählen",
> wieviele #'s es gibt, und dann muss ich halt die 3 größten
> ausgeben, aber auch nur die. Also habe ich einmal das
> Problem, sie zu zählen, dann, die ersten 3 davon zu
> bestimmen, und als letztes noch, nur diese auszugeben.
<xsl:if test="position() lt 4"> ... </xsl:if>
Viele Grüße
Rainer
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 23:09 Di 04.12.2007 | Autor: | rainerS |
Hallo Bastiane!
> Hallo rainerS!
>
> > > 1.) Wie bekomme ich das so eingerückt, dass die jeweils
> > > ersten Rauten untereinander stehen? Gibt es da irgendwas,
> > > womit ich sagen kann, dass das an der so und so vielten
> > > Stelle hinsoll? Irgendwie habe ich da gar keine Idee, wie
> > > man das machen könnte.
> >
> > Du kannst geschickt Funktionen benutzen. Zum Beispiel:
> >
> > 1: | <xsl:value-of
| 2: | > > select="count(current-group())"/> |
> >
> > gibt dir die Anzahl der Elemente der aktuellen Gruppe aus
> > (also die Anzahl der #), oder
> >
> > <xsl:sort select="count(current-group())"/>
> >
> > Mit max(string-length(author)) bekommst du die Länge des
> > längsten author-Elements.
>
> Sorry, das hatte ich wohl überlesen. Allerdings
> funktioniert das bei mir nicht. Mit
> <xsl:value-of select="max(string-length(author))"/>
> gibt er mir entweder 0 raus, wenn ich es relativ weit ans
> Ende stelle, oder er gibt mir in einem for-each nochmal nur
> string-length(author) aus. Wo muss ich das denn
> hinschreiben?
Hmm, stimmt, damit bekommst du ja nur unmittelbare Kinder. Eher so:
select="max(//string-length(author))"/>
um author-Elemente in beliebiger Tiefe zu bekommen, oder
<xsl:value-of select="max(book/string-length(author))"/>
innerhalb des book-list Template.
Tipp: Speichere den Wert in einer Variablen mit xsl:variable:
<xsl:variable name="maxlen" select="max(//string-length(author))"/>
Dann kannst du später in der Schleife so etwas wie "($maxlen)+3-(string-length(author))" schreiben.
Viele Grüße
Rainer
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 00:07 Mi 05.12.2007 | Autor: | rainerS |
Hallo Bastiane!
> <xsl:value-of select="maxlen"/>
Das nimmt das Element namens "maxlen". Für die Variable musst du "$maxlen" schreiben.
Viele Grüße
Rainer
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 11:03 Mi 05.12.2007 | Autor: | rainerS |
Hallo Bastiane!
> Hab's jetzt endlich endlich hinbekommen! Allerdings
> gibt es noch zwei "Schönheitsfehler":
>
> 1.) Eigentlich bräuchte ich ja nur die maximale Länge der
> drei ersten Elemente. Ich habe nämlich in meiner library
> ein ziemlich langes "Element", weil da mehrere Autoren
> vorkommen, und so viel Platz muss er da ja dann auch nicht
> machen. Aber kann ich irgendwie nur die längste Länge der
> drei ersten Elemente berechnen?
Es geht bestimmt irgendwie
Idee: mach die Transformation in zwei Schritten: im ersten erzeugst du aus dem book-list Element eine verkürzte Liste (wieder als XML), die nur die 3 gewünschten Autoren und die Anzahl der Bücher enthält. Dann transformierst du im zweiten Schritt dieses xml in die gewünschte Ausgabeform.
> 2.) Bevor ich nur die 3 ersten ausgab, hatte ich das mit
> allen Büchern getestet. Ich weiß nicht, ob es am
> Textprogramm liegt oder ob ich es anders schreiben muss,
> aber Umlaute zeigt er nicht an bzw. schreibt da so ein paar
> komische Zeichen hin. Und dadurch werden dann die #-Zeichen
> verrückt.
Passiert das, wenn du es direkt ausgibst, oder auch, wenn du die Ausgabe in eine Datei schreibst?
Es sieht mir nach einem Encoding-Problem aus. So ins Blaue hinein vermute ich, dass die Ausgabe der Umlaute im UTF8-Encoding passiert. In diesem Encoding sind alle nicht ASCII-Zeichen mehr als ein Byte lang. Wenn bei der Ausgabe alle Zeichen als ein Byte lang interpretiert werden (zum Beispiel im Encoding ISO 8859-1), dann werden die Umlaute als zwei Zeichen ausgegeben. Ein "ä" wird so zu "ä".
Zum Beispiel Windows Notepad hat so seine Probleme mit UTF8; ein vernünftiger Editor hilft
Viele Grüße
Rainer
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 00:31 Do 06.12.2007 | Autor: | Bastiane |
Hallo Rainer!
Danke, aber das hat leider dann doch nicht mehr hingehauen. Brauche jetzt dringend etwas Schlaf.
> > 1.) Eigentlich bräuchte ich ja nur die maximale Länge der
> > drei ersten Elemente. Ich habe nämlich in meiner library
> > ein ziemlich langes "Element", weil da mehrere Autoren
> > vorkommen, und so viel Platz muss er da ja dann auch nicht
> > machen. Aber kann ich irgendwie nur die längste Länge der
> > drei ersten Elemente berechnen?
>
> Es geht bestimmt irgendwie
Gut, das heißt, ganz so einfach ist es nicht, ja? Hatte gerade noch überlegt, ob ich es ändern soll und einfach einen festen Wert eingeben soll, aber das könnte ja theoretisch Komplikationen geben, wenn dann der längste zu lang ist und auch noch ausgegeben werden muss. Deswegen habe ich es so gelassen - finde es so "korrekter".
> Idee: mach die Transformation in zwei Schritten: im ersten
> erzeugst du aus dem book-list Element eine verkürzte Liste
> (wieder als XML), die nur die 3 gewünschten Autoren und die
> Anzahl der Bücher enthält. Dann transformierst du im
> zweiten Schritt dieses xml in die gewünschte Ausgabeform.
Heißt das, ich müsste zwei Stylesheets schreiben? Muss ich das dann auch zweimal aufrufen? Oder ginge das irgendwie in eins? Aber wahrscheinlich wird das eh zu kompliziert.
> > 2.) Bevor ich nur die 3 ersten ausgab, hatte ich das mit
> > allen Büchern getestet. Ich weiß nicht, ob es am
> > Textprogramm liegt oder ob ich es anders schreiben muss,
> > aber Umlaute zeigt er nicht an bzw. schreibt da so ein paar
> > komische Zeichen hin. Und dadurch werden dann die #-Zeichen
> > verrückt.
>
> Passiert das, wenn du es direkt ausgibst, oder auch, wenn
> du die Ausgabe in eine Datei schreibst?
Mmh, also unser "Eingabebefehl" (allerdings für die letzte Aufgabe)war:
java -cp saxon8.jar net.sf.saxon.Transform -o library.html -s library.xml library-html.xsl
Ich glaube, da wird es direkt in eine Datei geschrieben!? Jedenfalls musste ich danach die Datei library.html (glaube ich ) öffnen, um etwas zu sehen. Und da passierte es immer.
> Es sieht mir nach einem Encoding-Problem aus. So ins Blaue
> hinein vermute ich, dass die Ausgabe der Umlaute im
> UTF8-Encoding passiert. In diesem Encoding sind alle nicht
> ASCII-Zeichen mehr als ein Byte lang. Wenn bei der Ausgabe
> alle Zeichen als ein Byte lang interpretiert werden (zum
> Beispiel im Encoding ISO 8859-1), dann werden die Umlaute
> als zwei Zeichen ausgegeben. Ein "ä" wird so zu "ä".
>
> Zum Beispiel Windows Notepad hat so seine Probleme mit
> UTF8; ein vernünftiger Editor hilft
Aber man nimmt schon UTF-8, oder? Muss mir das für eine andere Vorlesung nochmal angucken mit den ganzen Codes - habe das schon wieder vergessen, was da was war...
Gibt es denn einen Editor, mit dem das besser wäre, den ich evtl. auf dem Rechner haben oder leicht runterladen könnte? (also nichts kompliziertes...) Hatte es mit dem editor geschrieben und nach deiner Mitteilung hier mal mit Wordpad (ist das dasselbe wie Notepad?) ausprobiert, auch mit anderen Codierungen, aber es hat nicht geholfen (oder ich habe wieder etwas falsch gemacht...).
Aber was noch etwas wichtiger ist: Liegt es daran, wie ich es schreiben oder daran, wie man es öffnet? Ich würde, an ersterem, das heißt, wer auch immer sich meine Lösung anguckt, wird die Umlaute auch nicht angezeigt bekommen, oder? Das ist natürlich nicht so toll... Vllt kann ich das demnächst doch mal ändern.
Viele Grüße und nochmals danke für alles
Bastiane
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 12:43 Do 06.12.2007 | Autor: | rainerS |
Hallo Bastiane!
> Hallo Rainer!
>
> Danke, aber das hat leider dann doch nicht mehr hingehauen.
> Brauche jetzt dringend etwas Schlaf.
Richtig, da war was
> > > 1.) Eigentlich bräuchte ich ja nur die maximale Länge der
> > > drei ersten Elemente. Ich habe nämlich in meiner library
> > > ein ziemlich langes "Element", weil da mehrere Autoren
> > > vorkommen, und so viel Platz muss er da ja dann auch nicht
> > > machen. Aber kann ich irgendwie nur die längste Länge der
> > > drei ersten Elemente berechnen?
> >
> > Es geht bestimmt irgendwie
>
> Heißt das, ich müsste zwei Stylesheets schreiben? Muss ich
> das dann auch zweimal aufrufen? Oder ginge das irgendwie in
> eins? Aber wahrscheinlich wird das eh zu kompliziert.
Mit zweien geht's auf jeden Fall. Mit xslt 2.0 geht's auch in einem, denn da kann man Zwischenergebnisse erzeugen, die man weiterverarbeitet.
Ich habe mal nachgeschaut, wie man das macht: Hier baue ich ein neues Element "top-book-list" in einer Variablen auf und wende dann Templates darauf an:
1: | <xsl:variable name="temp-tree" as="document-node()">
| 2: | <xsl:document>
| 3: | <top-book-list>
| 4: |
| 5: | ... gewünschte elemente zusammenbauen...
| 6: |
| 7: | </top-book-list>
| 8: | </xsl:document>
| 9: | </xsl:variable>
| 10: | <xsl:apply-templates select="$temp-tree"/> |
> > > 2.) Bevor ich nur die 3 ersten ausgab, hatte ich das mit
> > > allen Büchern getestet. Ich weiß nicht, ob es am
> > > Textprogramm liegt oder ob ich es anders schreiben muss,
> > > aber Umlaute zeigt er nicht an bzw. schreibt da so ein paar
> > > komische Zeichen hin. Und dadurch werden dann die #-Zeichen
> > > verrückt.
> >
> > Passiert das, wenn du es direkt ausgibst, oder auch, wenn
> > du die Ausgabe in eine Datei schreibst?
>
> Mmh, also unser "Eingabebefehl" (allerdings für die letzte
> Aufgabe)war:
> java -cp saxon8.jar net.sf.saxon.Transform -o library.html
> -s library.xml library-html.xsl
> Ich glaube, da wird es direkt in eine Datei geschrieben!?
> Jedenfalls musste ich danach die Datei library.html (glaube
> ich ) öffnen, um etwas zu sehen. Und da
> passierte es immer.
>
> > Es sieht mir nach einem Encoding-Problem aus. So ins Blaue
> > hinein vermute ich, dass die Ausgabe der Umlaute im
> > UTF8-Encoding passiert. In diesem Encoding sind alle nicht
> > ASCII-Zeichen mehr als ein Byte lang. Wenn bei der Ausgabe
> > alle Zeichen als ein Byte lang interpretiert werden (zum
> > Beispiel im Encoding ISO 8859-1), dann werden die Umlaute
> > als zwei Zeichen ausgegeben. Ein "ä" wird so zu "ä".
> >
> > Zum Beispiel Windows Notepad hat so seine Probleme mit
> > UTF8; ein vernünftiger Editor hilft
>
> Aber man nimmt schon UTF-8, oder? Muss mir das für eine
> andere Vorlesung nochmal angucken mit den ganzen Codes -
> habe das schon wieder vergessen, was da was war...
>
> Gibt es denn einen Editor, mit dem das besser wäre, den ich
> evtl. auf dem Rechner haben oder leicht runterladen könnte?
> (also nichts kompliziertes...) Hatte es mit dem editor
> geschrieben und nach deiner Mitteilung hier mal mit Wordpad
> (ist das dasselbe wie Notepad?) ausprobiert, auch mit
> anderen Codierungen, aber es hat nicht geholfen (oder ich
> habe wieder etwas falsch gemacht...).
Ich hab's gerade mal ausprobiert (auf einem XP Rechner): Wordpad stellt UTF8 falsch dar, Notepad ("Editor") scheint es richtig zu machen (hat mich überrascht), hat aber Probleme mit Unix/Linux Zeilenenden.
Probier mal SciTe, der hat gleich Unterstützung für verschiedene Programmiersprachen (Syntax-Highlighting, automatisches Einrücken und so).
> Aber was noch etwas wichtiger ist: Liegt es daran, wie ich
> es schreiben oder daran, wie man es öffnet?
Eher daran, ob der Editor mit dem Encoding klar kommt.
Viele Grüße
Rainer
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:10 Do 06.12.2007 | Autor: | Bastiane |
Hallo Rainer!
> Ich habe mal nachgeschaut, wie man das macht: Hier baue ich
> ein neues Element "top-book-list" in einer Variablen auf
> und wende dann Templates darauf an:
>
> 1: | <xsl:variable name="temp-tree" as="document-node()">
| 2: | > <xsl:document>
| 3: | > <top-book-list>
| 4: | >
| 5: | > ... gewünschte elemente zusammenbauen...
| 6: | >
| 7: | > </top-book-list>
| 8: | > </xsl:document>
| 9: | > </xsl:variable>
| 10: | > <xsl:apply-templates select="$temp-tree"/> |
Das gucke ich mir mal genauer an, wenn ich dann für die Klausur lerne...
> Ich hab's gerade mal ausprobiert (auf einem XP Rechner):
> Wordpad stellt UTF8 falsch dar, Notepad ("Editor") scheint
> es richtig zu machen (hat mich überrascht), hat aber
> Probleme mit Unix/Linux Zeilenenden.
Komisch, ich hatte es doch mit dem Editor geschrieben!?
> Probier mal SciTe, der
> hat gleich Unterstützung für verschiedene
> Programmiersprachen (Syntax-Highlighting, automatisches
> Einrücken und so).
Danke.
> > Aber was noch etwas wichtiger ist: Liegt es daran, wie ich
> > es schreiben oder daran, wie man es öffnet?
>
> Eher daran, ob der Editor mit dem Encoding klar kommt.
Jaja, aber der Editor mit dem ich die Datei schreibe oder der Editor, mit dem man die Datei öffnet?
Viele Grüße
Bastiane
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 12:17 Fr 07.12.2007 | Autor: | rainerS |
Hallo Bastiane!
> > > Aber was noch etwas wichtiger ist: Liegt es daran, wie ich
> > > es schreiben oder daran, wie man es öffnet?
> >
> > Eher daran, ob der Editor mit dem Encoding klar kommt.
>
> Jaja, aber der Editor mit dem ich die Datei schreibe oder
> der Editor, mit dem man die Datei öffnet?
Schwer zu sagen. Ich würde auf das zweite tippen, aber ohne die Dateien selber anzuschauen...
Viele Grüße
Rainer
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 15:48 Di 04.12.2007 | Autor: | rainerS |
Hallo Bastiane!
> Hallo nochmal!
>
> Die obigen Vorschläge probiere ich jetzt mal aus, aber
> meine 1. Frage wurde noch gar nicht beantwortet...
Siehe meinen Hinweis auf max(string-length(author)).
> > 1.) Wie bekomme ich das so eingerückt, dass die jeweils
> > ersten Rauten untereinander stehen? Gibt es da irgendwas,
> > womit ich sagen kann, dass das an der so und so vielten
> > Stelle hinsoll? Irgendwie habe ich da gar keine Idee, wie
> > man das machen könnte.
Idee: Benutze (string-length(author)) um die Länge des author-Eintrags zu finden. Dann musst du für jeden Autor (zum Beispiel) 20-(string-length(author)) Leerzeichen ausgeben, etwa so (ungetestet):
1: | <xsl:for-each select="1 to 20-(string-length(author))">
| 2: | <xsl:text> </xsl:text>
| 3: | </xsl:for-each> |
Viele Grüße
Rainer
|
|
|
|