dey: komplzierte (!?) Abfrage

Hallo,

ich habe mich ein wenig in den Hierachien meiner XML-Datei verlaufen.

Auszug aus meiner XML-Datei:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="game.xsl"?>
<all_games>
<game gid="4" match="Hallenturnier in Floersheim" yy="05" mm="01" dd="15">
  <result>7. Platz</result>
  <report_h>- 7. Platz -</report_h>
  <all_players>
   <player name="Spieler1">
   <goals>3</goals><goalkee></goalkee>
   </player>

<player name="Spieler">
   <goals>0</goals><goalkee></goalkee>
   </player>

Ich möchte jetzt gerne alle Spiele an denen ein bestimmter Spieler teilgenommen hat:

  • ich kann die Spiele herausfiltern
    <xsl:for-each select="//all_games/game/all_players/player[@name = $name]">
  • aber ich komme jetzt nicht mehr an die Werte oberhalb der player-Ebene wie gid oder match

Wie komme ich an diese Werte

bydey

--
-- noch immer ein erfolgloser <DIV> Jünger --
  1. Hi,

    <game gid="4" match="Hallenturnier in Floersheim" yy="05" mm="01" dd="15">
      <result>7. Platz</result>
      <report_h>- 7. Platz -</report_h>
      <all_players>
       <player name="Spieler1">
       <goals>3</goals><goalkee></goalkee>
       </player>

    <player name="Spieler">
       <goals>0</goals><goalkee></goalkee>
       </player>

    Ich möchte jetzt gerne alle Spiele an denen ein bestimmter Spieler teilgenommen hat:

    • ich kann die Spiele herausfiltern
      <xsl:for-each select="//all_games/game/all_players/player[@name = $name]">

    Du willst also nicht den Spieler, sondern ein Spiel selektieren.
    Also darfst Du auch nur das Spiel selektieren - das mit den Spielern gehört in die [].

    Also eher so:
    <xsl:for-each select="//all_games/game[all_players/player@name = $name]">

    (ungetestet)

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Hallo Mudguard,

      Du willst also nicht den Spieler, sondern ein Spiel selektieren.
      Also darfst Du auch nur das Spiel selektieren - das mit den Spielern gehört in die [].

      Also eher so:
      <xsl:for-each select="//all_games/game[all_players/player@name = $name]">

      (ungetestet)

      Die Test-Antwort lautet:
      Erwartetes Token ']' fand '@'. //all_games/game[all_players/player-->@<--name = $name]

      Das habe ich so oder so ähnlich selbst getestet.

      bydey

      --
      -- noch immer ein erfolgloser <DIV> Jünger --
      1. Hallo,

        Also eher so:
        <xsl:for-each select="//all_games/game[all_players/player@name = $name]">

        (ungetestet)

        Die Test-Antwort lautet:
        Erwartetes Token ']' fand '@'. //all_games/game[all_players/player-->@<--name = $name]

        Das habe ich so oder so ähnlich selbst getestet.

        Verschachtelungsfehler:

        //all_games/game[all_players/player[@name = $name]]

        Was genau möchtest du erreichen?

        Grüße
        Thomas

        --
        Surftip: kennen Sie schon Pipolino's Clowntheater?
        http://www.clowntheater-pipolino.net/
        1. Hallo Thomas,

          Verschachtelungsfehler:

          den hat mir Mudguard eingebrockt

          //all_games/game[all_players/player[@name = $name]]

          Was genau möchtest du erreichen?

          Bestimmte Inhalte für alle Spiele ausgeben, die eine bestimmten Spieler enthalten.

          bydey

          --
          -- noch immer ein erfolgloser <DIV> Jünger --
  2. Hallo dey,

    • aber ich komme jetzt nicht mehr an die Werte oberhalb der player-Ebene wie gid oder match

    Dafür gibt es "ancestor" (Vorfahre).

    Gruß Mia

    1. Hallo Mia,

      Dafür gibt es "ancestor" (Vorfahre).

      Bist du auch noch so gut mir ein kurzes Beispiel zu geben?

      bydey

      --
      -- noch immer ein erfolgloser <DIV> Jünger --
      1. Hallo dey,

        <all_games>
        <game gid="4" match="Hallenturnier in Floersheim" yy="05" mm="01" dd="15">
          <result>7. Platz</result>
          <report_h>- 7. Platz -</report_h>
          <all_players>
           <player name="Spieler1">
           <goals>3</goals><goalkee></goalkee>
           </player>

        <player name="Spieler">
           <goals>0</goals><goalkee></goalkee>
           </player>

        <xsl:for-each select="//all_games/game/all_players/player[@name = $name]">

        Wenn du zum Beispiel an result kommen möchtest, müsste
        <xsl:value-of select="ancestor::result"/>
        zum gewünschten Ergebnis führen.
        Für die Attribute aus game so etwas wie
        <xsl:value-of select="ancestor::game[@...]"/>

        Gruß Mia

        1. Hallo Mia,

          <xsl:for-each select="//all_games/game/all_players/player[@name = $name]">

          Wenn du zum Beispiel an result kommen möchtest, müsste
          <xsl:value-of select="ancestor::result"/>
          zum gewünschten Ergebnis führen.
          Für die Attribute aus game so etwas wie
          <xsl:value-of select="ancestor::game[@...]"/>

          <xsl:value-of select="ancestor::game[@match]"/>
          Das funktioniert soweit schon gut, ich bekomme allerdings keinen Einzelzugriff auf die Atrribute von game.
          Alles wird unkontrolliert ausgegeben!

          <xsl:value-of select="ancestor::game/result"/>
          funktioniert wie gewünscht.

          bydey

          --
          -- noch immer ein erfolgloser <DIV> Jünger --
          1. Hallo,

            <xsl:value-of select="ancestor::game[@match]"/>
            Das funktioniert soweit schon gut, ich bekomme allerdings keinen Einzelzugriff auf die Atrribute von game.
            Alles wird unkontrolliert ausgegeben!

            Habe mir selbst geholfen!
            <xsl:for-each select="//all_games/game/all_players/player[@name = $name]">
            <xsl:for-each select="ancestor::game">
              <br/><xsl:value-of select="@match"/> <xsl:value-of select="result"/><br/>
            </xsl:for-each>
            </xsl:for-each>

            bydey

            --
            -- noch immer ein erfolgloser <DIV> Jünger --
            1. Hallo,

              Habe mir selbst geholfen!
              <xsl:for-each select="//all_games/game/all_players/player[@name = $name]">
              <xsl:for-each select="ancestor::game">
                <br/><xsl:value-of select="@match"/> <xsl:value-of select="result"/><br/>
              </xsl:for-each>
              </xsl:for-each>

              <xsl:for-each select="/all_games/game[all_players/player[@name = $name]]">
              <br/><xsl:value-of select="@match"/> <xsl:value-of select="result"/><br/>
              </xsl:for-each>

              oder

              <xsl:key name="spieler" match="game" use="all_players/player/@name" />

              <xsl:for-each select="/all_games/game[key('spieler', $name)]">
                  <br/><xsl:value-of select="@match"/> <xsl:value-of select="result"/><br/>
                 </xsl:for-each>

              Grüße
              Thomas

              --
              Surftip: kennen Sie schon Pipolino's Clowntheater?
              http://www.clowntheater-pipolino.net/
              1. Hallo Thomas,

                nochmals danke

                <xsl:for-each select="/all_games/game[all_players/player[@name = $name]]">
                <br/><xsl:value-of select="@match"/> <xsl:value-of select="result"/><br/>
                </xsl:for-each>

                oder

                <xsl:key name="spieler" match="game" use="all_players/player/@name" />

                <xsl:for-each select="/all_games/game[key('spieler', $name)]">
                    <br/><xsl:value-of select="@match"/> <xsl:value-of select="result"/><br/>
                   </xsl:for-each>

                Das ist natürlich viel eleganter.

                bydey

                --
                -- noch immer ein erfolgloser <DIV> Jünger --