Zapp: Schwieriges XPath-Statement gesucht!

Hallo zusammen,

ich suche ein XPath-Statement, welches mir die Anzahl gewonnener Spiele eines Teams generiert. Schaut euch am besten mal die beiden Quelltexte an, dann wird klar, was ich meine (mir geht es um die Zeile: <xsl:variable name="gewonnen" select="???"/>)

XML-Datei:

<?xml-stylesheet href="em.xsl" type="text/xsl" ?>
<resultate gruppe="B">
 <spiel>
  <datum>13-Jun-04</datum>
  <team tore="0">Schweiz</team>
  <team tore="0">Kroatien</team>
 </spiel>
 <spiel>
  <datum>13-Jun-04</datum>
  <team tore="2">Frankreich</team>
  <team tore="1">England</team>
 </spiel>
 <spiel>
  <datum>17-Jun-04</datum>
  <team tore="0">England</team>
  <team tore="0">Schweiz</team>
 </spiel>
 <spiel>
  <datum>17-Jun-04</datum>
  <team tore="3">Kroatien</team>
  <team tore="0">Frankreich</team>
 </spiel>
 <spiel>
  <datum>21-Jun-04</datum>
  <team tore="1">Kroatien</team>
  <team tore="0">England</team>
 </spiel>
 <spiel>
  <datum>21-Jun-04</datum>
  <team tore="0">Schweiz</team>
  <team tore="0">Frankreich</team>
 </spiel>
</resultate>

XSL-Datei:

<?xml version='1.0'?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:variable name="teams" select="//team[not(.=preceding::team)]"/>
<xsl:variable name="spiele" select="//spiel"/>

<xsl:template match="resultate">
<html><body>
   <table border="5">
      <tr>
        <th>Team</th>
        <th>Spiele</th>
        <th>Gewonnen</th>
        <th>Geschossen</th>
        <th>Erhalten</th>
     </tr>
   <xsl:for-each select="$teams">
        <xsl:variable name="this" select="."/>
        <xsl:variable name="gespielt" select="count($spiele[team=$this])"/>
        <xsl:variable name="gewonnen" select="???"/>
        <xsl:variable name="geschossen" select="sum($spiele/team[.=current()]/@tore)"/>
        <xsl:variable name="erhalten" select="sum($spiele[team=current()]/team/@tore) - $geschossen"/>
        <tr>
        <td><xsl:value-of select="."/></td>
        <td><xsl:value-of select="$gespielt"/></td>
        <td><xsl:value-of select="$gewonnen"/></td>
        <td><xsl:value-of select="$geschossen"/></td>
        <td><xsl:value-of select="$erhalten"/></td>
        </tr>
   </xsl:for-each>
   </table>
</body></html>
</xsl:template>

</xsl:stylesheet>

Weiss da jemand, welcher Art das XPath-Statement sein soll, um dieses Problem zu lösen? Bin sehr gespannt,wie eine solche Lösung aussieht. Nimmt mich natürlich schon wunder, warum ich nicht selber drauf gekommen bin ;).

Also, vielen Dank für jedwelche inputs!!!

Lg, Zapp

  1. Hi,

    ich suche ein XPath-Statement, welches mir die Anzahl gewonnener Spiele eines Teams generiert. Schaut euch am besten mal die beiden Quelltexte an, dann wird klar, was ich meine (mir geht es um die Zeile: <xsl:variable name="gewonnen" select="???"/>)

    Du suchst die Anzahl der <spiel>-Elemente, für die gilt, dass entweder das erste <team>-Element gleich $this ist und dessen tore-Attribut größer als das des zweiten <team>-Elements ist, oder das zweite <team>-Element gleich $this ist und dessen tore-Attribut größer als das des ersten <team>-Elements ist. Wo ist das schwierig? :-)

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Du suchst die Anzahl der <spiel>-Elemente, für die gilt, dass entweder das erste <team>-Element gleich $this ist und dessen tore-Attribut größer als das des zweiten <team>-Elements ist, oder das zweite <team>-Element gleich $this ist und dessen tore-Attribut größer als das des ersten <team>-Elements ist. Wo ist das schwierig? :-)

      Cheatah

      Hey Cheatah,

      die Schwierigkeit liegt darin, dass ich Mühe habe, das XPath-Statement explizit zu formulieren ;). Deine Überlegung tönt gut,
      und so in etwa habe ich mir das auch vorgestellt. Aber wie forumuliere ich dieses "entweder oder" und wie zähle ich die
      Anzahl Siege zusammen (welche Funktion bietet sich an)? Habe Mühe
      mit der Syntax, vorallem mit den Prädikaten! Für mein Verständnis
      wäre eine explizite Lösung genial! Würd mir echt helfen. Denn verstehen will ichs unbedingt :)!!!! Manno.

      Danke, Zapp

      1. Hi,

        die Schwierigkeit liegt darin, dass ich Mühe habe, das XPath-Statement explizit zu formulieren ;).

        was hast Du versucht, woran ist es gescheitert?

        Aber wie forumuliere ich dieses "entweder oder"

        Mit Boole'schen Ausdrücken und korrekter Klammerung.

        und wie zähle ich die Anzahl Siege zusammen (welche Funktion bietet sich an)?

        Die entsprechende Funktion hast Du bereits an anderer Stelle verwendet.

        Habe Mühe mit der Syntax, vorallem mit den Prädikaten!

        Das glaube ich nicht wirklich, zumal Du sie schon benutzt.

        Für mein Verständnis wäre eine explizite Lösung genial!

        Sorry, aber das einzige, was ich von fertigen Lösungen halte, ist Abstand.

        Denn verstehen will ichs unbedingt :)!

        Das freut mich zu hören.

        Cheatah

        --
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. He Cheatah, Abstand :(

          glaub mir, ich versuchs, lass dich nicht täuschen, von dem, was schon im Quelltext steht, ich hab wirklich Probleme die Syntax zu verstehen, vorallem wenn Prädikate eingesetzt werden.

          also, wir wollen die anzahl <spiel>-elemente zählen:

          select="count($spiele ... ) richtig?

          ... dass entweder das erste <team>-Element gleich $this ist und dessen tore-Attribut grösser als das des zweiten <team>-Elements ist oder ...

          entweder oder:

          ( .... ) or ( ... )

          oder eine funktion wie boolean() oder not()?

          es muss ja soetwas sein wie if else (javamässig), also if das erste <team>-Element gleich $this ist und das tore-Attribut grösser ist als das des zweiten <team>-Elements, dann zähle es dazu ... oder umgekehrt, wenn nicht.

          Weitere Frage: Wie refereziere ich?
          ($spiele[team=$this]/@tore > $spiele[team!=this]/@tore) so? kaum!

          Weitere Frage: Frage mich langsam, ob es überhaupt möglich ist mit einem XPath-Statement zu lösen, ob nicht noch XSLT-Elemente eingeführt werden müssen? nicht, oder?

          Habe bei meinen Versuchen auch oft "Der Ausdruck gibt keinen DOM-Knoten zurück." bekommen!

          Hmm, du siehst, ich schwimme total!

          Vielleicht könntest du mir ja helfen, ohne eine ganze Lösung zu präsentieren, indem du mir, die Syntax (also abstrakt) meines gesuchten Statements vorgibst und ich versuche, es konkret zu machen? Ja, ich kenne die Vorbehalte gegen fertige Lösungen, ist schon nicht so ganz das Wahre, obwohl ich glaube, dass, nachdem ich mich damit beschäftigt habe, mir eine Lösung sicher "Aha"-Momente verschaffen würde, und damit meinem Verständnis der ganzen Materie dienen würde. Aber stimmt, Fordern ist schon ok, bis zu einem gewissen Punkt. ;)

          LG, Zapp