www.vorhilfe.de
Vorhilfe

Kostenlose Kommunikationsplattform für gegenseitige Hilfestellungen.
Hallo Gast!einloggen | registrieren ]
Startseite · Forum · Wissen · Kurse · Mitglieder · Team · Impressum
Forenbaum
^ Forenbaum
Status Englisch
  Status Grammatik
  Status Lektüre
  Status Korrekturlesen
  Status Übersetzung
  Status Sonstiges (Englisch)

Gezeigt werden alle Foren bis zur Tiefe 2

Navigation
 Startseite...
 Neuerdings beta neu
 Forum...
 vorwissen...
 vorkurse...
 Werkzeuge...
 Nachhilfevermittlung beta...
 Online-Spiele beta
 Suchen
 Verein...
 Impressum
Das Projekt
Server und Internetanbindung werden durch Spenden finanziert.
Organisiert wird das Projekt von unserem Koordinatorenteam.
Hunderte Mitglieder helfen ehrenamtlich in unseren moderierten Foren.
Anbieter der Seite ist der gemeinnützige Verein "Vorhilfe.de e.V.".
Partnerseiten
Weitere Fächer:

Open Source FunktionenplotterFunkyPlot: Kostenloser und quelloffener Funktionenplotter für Linux und andere Betriebssysteme
Forum "Sonstiges" - xslt
xslt < Sonstiges < Hochschule < Informatik < Vorhilfe
Ansicht: [ geschachtelt ] | ^ Forum "Sonstiges"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien

xslt: for-each-group
Status: (Frage) beantwortet Status 
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
[cap]


        
Bezug
xslt: Antwort
Status: (Antwort) fertig Status 
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

Bezug
                
Bezug
xslt: hilft nicht
Status: (Frage) beantwortet Status 
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
[cap]

Bezug
                        
Bezug
xslt: Antwort
Status: (Antwort) fertig Status 
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

Bezug
                                
Bezug
xslt: "Testdatei"
Status: (Frage) beantwortet Status 
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
[cap]


Bezug
                                        
Bezug
xslt: Antwort
Status: (Antwort) fertig Status 
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




Bezug
                                                
Bezug
xslt: Mitteilung
Status: (Mitteilung) Reaktion unnötig Status 
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. [kopfkratz]
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
[cap]

Bezug
        
Bezug
xslt: richtig gelöst?
Status: (Frage) beantwortet Status 
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
[cap]

Bezug
                
Bezug
xslt: Antwort
Status: (Antwort) fertig Status 
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"

[ok] ;-)

> <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.

[ok]

> <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! [daumenhoch]

Viele Grüße
   Rainer

Bezug
                        
Bezug
xslt: Danke.
Status: (Mitteilung) Reaktion unnötig Status 
Datum: 23:32 Mo 03.12.2007
Autor: Bastiane

Hallo Rainer!

Vielen Dank für die kleinen Ergänzungen. Und sorry, dass ich anfangs so doofe Fragen gestellt habe. Aber wenn ich nicht gewusst hätte, dass es bei dir mit der neuen Zeile z. B. klappt, dann hätte ich immer noch dafür nach einer anderen Möglichkeit gesucht. Dabei hatte ich es halt nur mit der falschen Anwendung geöffnet... ;-)

Viele Grüße
Bastiane
[cap]

Bezug
Ansicht: [ geschachtelt ] | ^ Forum "Sonstiges"  | ^^ Alle Foren  | ^ Forenbaum  | Materialien


^ Seitenanfang ^
www.englischraum.de
[ Startseite | Forum | Wissen | Kurse | Mitglieder | Team | Impressum ]