Mona: Problem mit gleichen Tags in xsl

Hallo, ich habe nicht wirklich viel Ahnung von xml bzw. xsl. Wir machen das gerade in der Schule. Ich habe ein xml Dokument zu einem Fussballspiel bekommen und soll eine xsl Datei dazu schreiben. Jetzt habe ich das Problem, dass mir bei mehreren gleichen Tags nur der erste angezeigt wird.

Ausschnitt im xml Dokument:

<Aufstellung>
	<AufstellungHeim>
	<Spieler>Kevin Trapp</Spieler>
	<Spieler>Florian Dick</Spieler>
	<Spieler>Martin Amedick</Spieler>
	<Spieler>Rodnei</Spieler>
</AufstellungHeim>
</Aufstellung>  

Ausschnitt im xsl Dokument:

<h2><u>Aufstellung</u></h2>
<table>
	<h3>Aufstellung des <xsl:value-of select="Fussballspiel/Heim"/></h3>
	<xsl:for-each select="Fussballspiel/Aufstellung/AufstellungHeim">
		<tr>
			<td><xsl:value-of select="Spieler"/></td>
		</tr>
	</xsl:for-each>
</table>

So wird mir im Browser nur der erste Spieler "Kevin Trapp" angezeigt. Ich würde mir aber gerne alle Spieler, am besten untereinander, anzeigen lassen.

Gewünscht:

Aufstellung

Aufstellung des 1.FcKaiserslautern

Kevin Trapp

Florian Dick

Martin Amedick

Rodnei

Ich hoffe die Informationen reichen und ich habe mein Problem richtig erläutert. Danke für die Hilfe :)

akzeptierte Antworten

  1. @@Mona

    Hallo, ich habe nicht wirklich viel Ahnung von xml bzw. xsl. Wir machen das gerade in der Schule.

    Habt ihr das was von xsl:template gehört?

    LLAP 🖖

    --
    „Wer durch Wissen und Erfahrung der Klügere ist, der sollte nicht nachgeben. Und nicht aufgeben.“ —Kurt Weidemann
    1. Ja, ich habe es auch versucht. Ich habe gelesen, dass es irgendwie mit <xsl:value-of select="." /> funktionieren soll, aber dann wird der komplette Text hintereinander und ohne Formatierung angezeigt.

  2. hallo

    <Aufstellung> <AufstellungHeim> <Spieler>Kevin Trapp</Spieler> <Spieler>Florian Dick</Spieler> <Spieler>Martin Amedick</Spieler> <Spieler>Rodnei</Spieler> </AufstellungHeim> </Aufstellung>

    Ausschnitt im xsl Dokument:

    <h2><u>Aufstellung</u></h2> <table> <h3>Aufstellung des <xsl:value-of select="Fussballspiel/Heim"/></h3> <xsl:for-each select="Fussballspiel/Aufstellung/AufstellungHeim">

    Keine Ahnung von xsl

    Aber Fussballspiel/Aufstellung/AufstellungHeim hast du nur 1 (eins)

    während du aber wohl über

    Fussballspiel/Aufstellung/AufstellungHeim/Spieler

    iterieren willst

      	<tr>
      		<td><xsl:value-of select="Spieler"/></td>
      	</tr>
      </xsl:for-each>
    

    </table>

    So wird mir im Browser nur der erste Spieler "Kevin Trapp" angezeigt. Ich würde mir aber gerne alle Spieler, am besten untereinander, anzeigen lassen.

  3. Hallo Mona,

    Ausschnitt im xsl Dokument:

    <h2><u>Aufstellung</u></h2> <table> <h3>Aufstellung des <xsl:value-of select="Fussballspiel/Heim"/></h3> <xsl:for-each select="Fussballspiel/Aufstellung/AufstellungHeim"> <tr> <td><xsl:value-of select="Spieler"/></td> </tr> </xsl:for-each> </table>

    So wird mir im Browser nur der erste Spieler "Kevin Trapp" angezeigt. Ich würde mir aber gerne alle Spieler, am besten untereinander, anzeigen lassen.

    Das xsl:for-each müsste auf Spieler zeigen und dann können die jeweiligen Textknoten via . oder text() ausgelesen werden:

    <xsl:for-each select="Fussballspiel/Aufstellung/AufstellungHeim/Spieler">
      <tr>
        <td>
          <xsl:value-of select="."/>
        </td>
      </tr>
    </xsl:for-each>
    
    

    Statt der Tabelle bietet sich evtl. eine Liste an (ul/li) und h3 ist kein Kindelement von table.

    Alternativ lässt sich mit mehreren Templates arbeiten, hier die Listenvariante:

    <xsl:template match="Fussballspiel">
      <h3><xsl:value-of select="Heim"/></h3>
      <ul>
        <xsl:apply-templates select="Aufstellung/AufstellungHeim/Spieler"/>
      </ul>
    </xsl:template>
    
    <xsl:template match="Spieler">
      <li><xsl:value-of select="."/></li>
    </xsl:template>
    
    

    Grüße,
    Thomas

    1. Hallo Thomas,

      Jetzt hat es funktioniert vielen Dank für die Hilfe und die Verbesserungsvorschläge!