xslt < Sonstiges < Hochschule < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 22:40 So 02.12.2007 | Autor: | Bastiane |
Aufgabe | Wir betrachten wieder bibliografische Angaben. Nun sollen einige Auswertungen im Textformat (Plain Text) erstellt werden.
b) Schreibe ein XSLT-Stylesheet lib-b.xsl, das die Bücher nach Autoren gruppiert, in folgendem Format:
** Rowling, Joanne K. **
Harry Potter und der Stein der Weisen. Rowling, Joanne K.
Harry Potter und die Kammer des Schreckens. Rowling, Joanne K.
** Pretchett, Terry **
The Colour of Magic. Pratchett, Terry
Die Gruppen sind dabei nach dem Namen der Autoren zu sortieren. Innerhalb jeder Gruppe wird nach Buchtitel sortiert. |
Hallo schon wieder...
Irgendwie mache ich da wohl etwas Grundlegendes falsch - das mit dem "for-each-group" bekomme ich nicht auf die Reihe. Habe gegoogelt und viel gefunden, aber irgendwie weiß ich trotzdem nicht, wie man das anwendet und was ich falsch mache. Könnte mir da jemand helfen? Ich habe geschrieben:
<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:sort select="title"/>
<xsl:value-of select="current-grouping-key()"/>
<xsl:value-of select="title"/>
<xsl:text>. </xsl:text>
<xsl:value-of select="author"/>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
Mir ist schon klar, dass da noch einiges fehlt, was in der Aufgabenstellung gefordert ist, aber ich will erstmal den Anfang versuchen. Ich bekomme da leider immer nur eine leere Datei raus... Was mache ich falsch?
Viele Grüße
Bastiane
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 00:31 Mo 03.12.2007 | Autor: | rainerS |
Hallo Bastiane!
Ist das dasselbe Eingabefile wie bei deiner letzten xslt-Frage?
Was mir spontan auffällt: du wählst die Elemente mit dem "author"-Attribut, wegen des @. In der Eingabe ist author kein Attribut, sondern ein Element.
Viele Grüße
Rainer
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 00:35 Mo 03.12.2007 | Autor: | Bastiane |
Hallo rainerS!
> Ist das dasselbe Eingabefile wie bei deiner letzten
> xslt-Frage?
Ja. Hatte ich das gepostet? Wusste ich gar nicht mehr.
> Was mir spontan auffällt: du wählst die Elemente mit dem
> "author"-Attribut, wegen des @. In der Eingabe ist author
> kein Attribut, sondern ein Element.
Ja, das hatte ich auch schon gedacht und es anders ausprobiert, hat aber leider auch nicht funktioniert. :-(
Viele Grüße
Bastiane
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 00:50 Mo 03.12.2007 | Autor: | rainerS |
Hallo Bastiane!
> > Was mir spontan auffällt: du wählst die Elemente mit dem
> > "author"-Attribut, wegen des @. In der Eingabe ist author
> > kein Attribut, sondern ein Element.
>
> Ja, das hatte ich auch schon gedacht und es anders
> ausprobiert, hat aber leider auch nicht funktioniert. :-(
Mit dem @ funktioniert's sicher nicht, wenn author ein Element ist. Poste doch bitte mal die xml-Datei, mit der du testest.
Viele Grüße
Rainer
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 15:03 Mo 03.12.2007 | Autor: | Bastiane |
Hallo Rainer!
Hier ist die Datei:
<book-list>
<book>
<author>Rowling, Joanne K.</author>
<title>Harry Potter und der Stein der Weisen</title>
<year>1998</year>
</book>
<book>
<author>Rowling, Joanne K.</author>
<title>Harry Potter und die Kammer des Schreckens</title>
<year>1999</year>
</book>
<book>
<author>Pratchett, Terry</author>
<title>The Colour of Magic</title>
<year>1983</year>
</book>
</book-list>
Das heißt, wir mussten letztes Mal schon eine größere Datei schreiben mir viel mehr Büchern, aber die hier zu posten wäre wahrscheinlich viel zu unübersichtlich (habe da glaube ich über 60 Bücher drin...). Glaube zwar nicht, dass es an der Datei liegt, denn letztes Mal hatte es auch mit meiner großen Bücherliste funktioniert, aber ich werde es heute abend mal mit dieser kleineren Datei versuchen.
Aber mache ich da nicht irgendwas Grundlegendes falsch? Ich weiß z. B. nie, wann ich wo was eingeben muss, wo jetzt template rules stehen müssen und wo sie angewendet werden und so...
Viele Grüße
Bastiane
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 15:35 Mo 03.12.2007 | Autor: | rainerS |
Hallo Bastiane!
Ganz kurz: wenn ich die beiden Dateien so verwende, wie du sie gepostet hast, bekomme ich auch eine leere Ausgabe. Wenn ich in der xsl-Datei "@author" durch "author" ersetze, gibt's eine Ausgabe - nicht die gewünschte, aber es passiert was.
Mit welchem xslt-Prozessor hast du es probiert, mit saxon:
java -jar saxon8.jar -s book-list.xml book-list.xsl
Viele Grüße
Rainer
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 19:27 Mo 03.12.2007 | Autor: | Bastiane |
Hallo Rainer!
> Ganz kurz: wenn ich die beiden Dateien so verwende, wie du
> sie gepostet hast, bekomme ich auch eine leere Ausgabe.
> Wenn ich in der xsl-Datei "@author" durch "author" ersetze,
> gibt's eine Ausgabe - nicht die gewünschte, aber es
> passiert was.
Oh, dann war das womöglich bei meinem Problem mit der neuen Zeile, dass ich da was geändert hatte.
Dann war hier wohl mein Problem, dass nicht das Gewünschte rauskam, denn bei irgendwas hatte ich auch eine Ausgabe. D.h., ich hatte bei dem anderen Problem mit der neuen Zeile halt immer die Ausgabe, dass er alles hintereinander reiht, aber halt keine neue Zeile anfängt. Und in diesem Fall hat er dann glaube ich (werd's aber nachher nochmal ausprobieren) dasselbe rausgegeben. Ist da nicht vllt doch ein Fehler bei dem, wie ich das anwende?
> Mit welchem xslt-Prozessor hast du es probiert, mit saxon:
>
> 1: | java -jar saxon8.jar -s book-list.xml
| 2: | > book-list.xsl |
Ja, genau, mit saxon sollen wir das machen. Aber ich glaube, der Befehl war noch was länger... Naja, ich geh jetzt erstmal duschen...
Viele Grüße
Bastiane
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 22:57 Mo 03.12.2007 | Autor: | Bastiane |
Hallo nochmal!
Irgendwie - nach sehr vielen Hindernissen - habe ich es wohl doch hinbekommen. Es scheint zu funktionieren, aber ganz sicher bin ich nicht. Deswegen poste ich das nochmal hier und setze mal meine Kommentare - so wie ich verstehe, was da passiert - kursiv dazwischen:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
"Vorwort"
<xsl:template match="//author">
<xsl:text>** </xsl:text>
<xsl:apply-templates/>
<xsl:text> **</xsl:text>
<xsl:text>
</xsl:text>
</xsl:template>
Erstellung eines Templates für den Autor, damit er dann schön in der Zeile drüber und mit den Sternchen vorne und hinten erscheint
<xsl:template match="//title">
<xsl:apply-templates/>
<xsl:text>. </xsl:text>
</xsl:template>
Template für den Titel - nach dem Titel soll ein Punkt und dann ein Leerzeichen kommen
<xsl:template match="book-list">
<xsl:for-each-group select="book" group-by="author">
<xsl:sort select="author"/>
Jetzt wird nach dem Autor "gruppiert" und dann auch noch danach sortiert, also dass der Autor mit Anfangsbuchstaben A als erstes ausgegeben wird und so. Ist es richtig, dass dieses "for-each-group" dann quasi alle Elemente, die dasselbe "Group-Element" haben, zusammenpackt? Also in meinem Fall sollen ja dann alle Buchtitel vom selben Autor betrachtet werden, und das scheint er hiermit einfach so zu machen
<xsl:apply-templates select="author"/>
Hier wird das Autor-Template angewandt, oder?
<xsl:for-each select="current-group()">
Das hier hatte ich lange nicht verstanden. Es betrachtet wohl jedes Element der aktuellen Gruppe, also in meinem Fall jedes Buch desselben Autors.
<xsl:sort select="title"/>
<xsl:apply-templates select="title"/>
<xsl:value-of select="author"/>
<xsl:text>
</xsl:text>
Hier wird dann unter allen diesen Elementen nach dem Titel sortiert, dann das Titel-Template angewandt, und dahinter dann nochmal der Autor ausgegeben. Und als letztes soll noch eine neue Zeile kommen, damit die Bücher vom selben Autor nicht alle hintereinander stehen.
</xsl:for-each>
<xsl:text>
</xsl:text>
Und hier kommt noch ne neue Zeile, damit der nächste Autor nicht direkt darunter kommt, sondern eine Zeile dazwischen frei ist.
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
Und das war's dann auch schon.
Habe ich das alles richtig verstanden? Oder funktioniert etwas anders als ich es versucht habe zu erklären? Oder ist sogar noch ein Fehler drin?
Viele Grüße
Bastiane
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 23:19 Mo 03.12.2007 | Autor: | rainerS |
Hallo Bastiane!
> <xsl:stylesheet version="2.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
> <xsl:output method="text" indent="yes"/>
>
> "Vorwort"
> <xsl:template match="//author">
> <xsl:text>** </xsl:text>
> <xsl:apply-templates/>
> <xsl:text> **</xsl:text>
> <xsl:text>
> </xsl:text>
> </xsl:template>
>
> Erstellung eines Templates für den Autor, damit er dann
> schön in der Zeile drüber und mit den Sternchen vorne und
> hinten erscheint
Ja. Dieses Template kann auf beliebige author-Elemente angewandt werden (wegen des match=).
> <xsl:template match="//title">
> <xsl:apply-templates/>
> <xsl:text>. </xsl:text>
> </xsl:template>
>
> Template für den Titel - nach dem Titel soll ein Punkt und
> dann ein Leerzeichen kommen
>
> <xsl:template match="book-list">
> <xsl:for-each-group select="book" group-by="author">
> <xsl:sort select="author"/>
>
> Jetzt wird nach dem Autor "gruppiert" und dann auch noch
> danach sortiert, also dass der Autor mit Anfangsbuchstaben
> A als erstes ausgegeben wird und so. Ist es richtig, dass
> dieses "for-each-group" dann quasi alle Elemente, die
> dasselbe "Group-Element" haben, zusammenpackt? Also in
> meinem Fall sollen ja dann alle Buchtitel vom selben Autor
> betrachtet werden, und das scheint er hiermit einfach so zu
> machen
Ja. Hier habe ich ein paar Beispiele zu xsl:for-each-group gefunden.
> <xsl:apply-templates select="author"/>
>
> Hier wird das Autor-Template angewandt, oder?
Genauer gesagt: es werden alle passenden Templates auf die author-Elemente im aktuellen Kontext angewandt. Da aber nur das Template mit match="//author" passt, ist es das einzige, das angewandt wird.
> <xsl:for-each select="current-group()">
>
> Das hier hatte ich lange nicht verstanden. Es betrachtet
> wohl jedes Element der aktuellen Gruppe, also in meinem
> Fall jedes Buch desselben Autors.
> <xsl:sort select="title"/>
> <xsl:apply-templates select="title"/>
> <xsl:value-of select="author"/>
> <xsl:text>
> </xsl:text>
>
> Hier wird dann unter allen diesen Elementen nach dem Titel
> sortiert, dann das Titel-Template angewandt, und dahinter
> dann nochmal der Autor ausgegeben.
Wie oben schon gesagt, es werden alle passenden Templates angewandt, aber auch hier schränkt das match="//title" ein.
> Und als letztes soll
> noch eine neue Zeile kommen, damit die Bücher vom selben
> Autor nicht alle hintereinander stehen.
>
> </xsl:for-each>
> <xsl:text>
> </xsl:text>
>
> Und hier kommt noch ne neue Zeile, damit der nächste Autor
> nicht direkt darunter kommt, sondern eine Zeile dazwischen
> frei ist.
>
> </xsl:for-each-group>
> </xsl:template>
> </xsl:stylesheet>
>
> Und das war's dann auch schon.
>
> Habe ich das alles richtig verstanden? Oder funktioniert
> etwas anders als ich es versucht habe zu erklären? Oder ist
> sogar noch ein Fehler drin?
Sieht gut aus!
Viele Grüße
Rainer
|
|
|
|