Benjamin: Prüfung für Nachfolger

Hallo,

ich habe aus einer xml-Datei eine Tabelle auf eine html-Seite transformiert.
Die xml-Datei sind vereinfacht in etwa so aus:

  
<element>  
  <Betreuer>Meyer</Betreuer>  
  <Patient>Klaus</Patient>  
  <Datum>1.11.08</Datum>  
</element>  
<element>  
  <Betreuer>Meyer</Betreuer>  
  <Patient>Peter</Patient>  
  <Datum>20.10.08</Datum>  
</element>  
<element>  
  <Betreuer>Schmidt</Betreuer>  
  <Patient>Martin</Patient>  
  <Datum>3.11.08</Datum>  
</element>  
<element>  
  <Betreuer>Müller</Betreuer>  
  ....  
  

Die Tabelle gibt mir jetzt eine Auflistung sortiert nach den Betreuern und den Patienten aus:

Betreuer    Patient   Datum
Meyer       Klaus     1.11.08
Meyer       Peter     20.10.08
Schmidt     Martin    3.11.08
Müller      ....

Ich möchte aber eine Trennzeile zwischen Meyer und Schmidt und für jeden weiteren Betreuer. Also so hier:

Betreuer    Patient   Datum
Meyer       Klaus     1.11.08
Meyer       Peter     20.10.08
--------------------------------
Schmidt     Martin    3.11.08
--------------------------------
Müller      ....

Wie mache ich das? Wie formuliere ich am besten die Bedingung und wie kann ich nach der Trennzeile die Tabelle fortsetzen?

Danke im Voraus,
Benjamin

  1. @@Benjamin:

    Die Tabelle gibt mir jetzt eine Auflistung sortiert nach den Betreuern und den Patienten aus:

    Sortiert deine Transformation oder gehst du davon aus, dass die Daten bereits sortiert in der XML-Datei stehen?

    Betreuer    Patient   Datum
    Meyer       Klaus     1.11.08
    Meyer       Peter     20.10.08

    Schmidt     Martin    3.11.08

    Müller      ....

    Das generierte Markup sollte also so aussehen:

    <table>  
      <thead>  
        <tr>  
          <th>Betreuer</th><th>Patient</th><th>Datum</th>  
        </tr>  
      </thead>  
      <tbody>  
        <tr>  
          <td>Meyer</td><td>Klaus</td><td>1.11.08</td>  
        </tr>  
        <tr>  
          <td>Meyer</td><td>Peter</td><td>20.10.08</td>  
        </tr>  
      </tbody>  
      <tbody>  
        <tr>  
          <td>Schmidt</td><td>Martin</td><td>3.11.08</td>  
        </tr>  
      </tbody>  
      <tbody>  
        <tr>  
          <td>Müller</td><td>....</td><td></td>  
        </tr>  
      </tbody>  
    </table>
    

    Die Trennlinien dann per CSS: 'border-top'/'border-bottom' für 'tbody'.

    Live long and prosper,
    Gunnar

    --
    Das einzige Mittel, den Irrtum zu vermeiden, ist die Unwissenheit. (Jean-Jacques Rousseau)
    1. @@Benjamin:

      Die Tabelle gibt mir jetzt eine Auflistung sortiert nach den Betreuern und den Patienten aus:

      Sortiert deine Transformation oder gehst du davon aus, dass die Daten bereits sortiert in der XML-Datei stehen?

      Betreuer    Patient   Datum
      Meyer       Klaus     1.11.08
      Meyer       Peter     20.10.08

      Schmidt     Martin    3.11.08

      Müller      ....

      Das generierte Markup sollte also so aussehen:

      <table>

      <thead>
          <tr>
            <th>Betreuer</th><th>Patient</th><th>Datum</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>Meyer</td><td>Klaus</td><td>1.11.08</td>
          </tr>
          <tr>
            <td>Meyer</td><td>Peter</td><td>20.10.08</td>
          </tr>
        </tbody>
        <tbody>
          <tr>
            <td>Schmidt</td><td>Martin</td><td>3.11.08</td>
          </tr>
        </tbody>
        <tbody>
          <tr>
            <td>Müller</td><td>....</td><td></td>
          </tr>
        </tbody>
      </table>

      
      >   
      > Die Trennlinien dann per CSS: 'border-top'/'border-bottom' für 'tbody'.  
      >   
      > Live long and prosper,  
      > Gunnar  
        
      Hallo Gunnar,  
        
      die Daten sortiere ich mittels Sort-Funktion.  
        
      Die Datenreihen habe ich allerdings bislang nur in einer Tabelle:  
      ~~~html
        
      <table>  
        <thead>  
          <tr>  
            <th>Betreuer</th><th>Patient</th><th>Datum</th>  
          </tr>  
        </thead>  
        <tbody>  
          <tr>  
            <td>Meyer</td><td>Klaus</td><td>1.11.08</td>  
          </tr>  
          <tr>  
            <td>Meyer</td><td>Peter</td><td>20.10.08</td>  
          </tr>  
          <tr>  
            <td>Schmidt</td><td>Martin</td><td>3.11.08</td>  
          </tr>  
          <tr>  
            <td>Müller</td><td>....</td><td></td>  
          </tr>  
        </tbody>  
      </table>
      

      Ich suche ja noch den Weg, um die Tabelle trennen zu können oder einfach eine Leerzeile einzufügen. Noch eine Idee?

      1. Hallo,

        Ich suche ja noch den Weg, um die Tabelle trennen zu können oder einfach eine Leerzeile einzufügen. Noch eine Idee?

        Ich hätte 2 Vorschläge:
        1. Zuerst gruppieren, damit alle Betreuer nur noch einmal vorkommen. Diese kannst du dann trennen. Die Zweite Abfrage auf deine Tabelle gibt dann pro gruppierten Betreuer alle Einträge aus.

        2. Alle Einträge in eine Variable sortieren und diese danach ausgeben. Hier kannst du mit position() und postion() +1 überprüfen, ob der Wert/ Inhalt von Betreuer gleich ist.

        bydey

        --
        -- bydey ist die Signatur und Verabschiedung, nicht der Nick --
        -- Navigate all your PHP web projects with  PHP Project Browser--
        1. Hallo dey,

          1. Alle Einträge in eine Variable sortieren und diese danach ausgeben. Hier kannst du mit position() und postion() +1 überprüfen, ob der Wert/ Inhalt von Betreuer gleich ist.

          Ok, aber wie genau mache ich das. daran scheitere ich leider :(

          Danke, Benjamin

          1. Hi .
            Im Detail kann ich es dir auch nicht erläuten, da ich exakt dein Problem noch nicht hatte. Ich wurde es so angehen:

            • ein xsl:variable tag öffnen
            • dein xsl:select ausführen
            • im der Variable noch ein xsl:sort ausführen
              Ich allerdings nicht sicher, ob die Variable jetzt auch die neuen position() setzt, so dass du auch benachbarte Werte vergleichen kannst.
              Bydey
            1. Hi .
              Im Detail kann ich es dir auch nicht erläuten, da ich exakt dein Problem noch nicht hatte. Ich wurde es so angehen:

              • ein xsl:variable tag öffnen
              • dein xsl:select ausführen
              • im der Variable noch ein xsl:sort ausführen
                Ich allerdings nicht sicher, ob die Variable jetzt auch die neuen position() setzt, so dass du auch benachbarte Werte vergleichen kannst.
                Bydey

              Hallo,

              falls es noch jemanden interessiert. Ich habe eine Lösung gefunden:

              und zwar habe ich:
              2 Variablen angelegt:

                
              Vorgaenger:  
              <xsl:value-of select="preceding-sibling::node()[1]/Betreuer"/>  
              Name:  
              <xsl:value-of select="Betreuer"/>  
              
              

              dann eine when-Funktion:

                
              <xsl:choose>  
                <xsl:when test="$Name = $NameVor">  
                  <xsl:call-template name="AnsichtBetreuer"/> <!-- mein Template um die Daten auszulesen -->  
                </xsl:when>  
                <xsl:when test="$NameVor=''"> <!-- um für den ersten Eintrag nicht schon eine Trennline zu erzeugen-->  
                  <xsl:call-template name="AnsichtBetreuer"/>  
                </xsl:when>  
                <xsl:otherwise>  
                  <xsl:call-template name="AnsichtBetreuer2"/> <!-- das gleiche Template nur mit anderen style (bottom-top-widht usw.) -->  
                </xsl:otherwise>  
              
              

              Ein Problem hatte ich nur noch mit der Formatierung der Tabellenzeilen. Die style-Definitionen konnte ich nicht für die Zeile angeben, ich musste es für jede einzelne Zelle in der betreffenden Zeile hinterlegen.. weiß nicht genau woran das liegt.
              Danke für die Hilfe!
              Benjamin

              1. Hallo,

                falls es noch jemanden interessiert. Ich habe eine Lösung gefunden:

                und zwar habe ich:
                2 Variablen angelegt:

                Vorgaenger:
                <xsl:value-of select="preceding-sibling::node()[1]/Betreuer"/>
                Name:
                <xsl:value-of select="Betreuer"/>

                
                > dann eine when-Funktion:  
                >   
                > ~~~xml
                  
                
                > <xsl:choose>  
                >   <xsl:when test="$Name = $NameVor">  
                >     <xsl:call-template name="AnsichtBetreuer"/> <!-- mein Template um die Daten auszulesen -->  
                >   </xsl:when>  
                >   <xsl:when test="$NameVor=''"> <!-- um für den ersten Eintrag nicht schon eine Trennline zu erzeugen-->  
                >     <xsl:call-template name="AnsichtBetreuer"/>  
                >   </xsl:when>  
                >   <xsl:otherwise>  
                >     <xsl:call-template name="AnsichtBetreuer2"/> <!-- das gleiche Template nur mit anderen style (bottom-top-widht usw.) -->  
                >   </xsl:otherwise>  
                > 
                
                

                So, nun ergibt sich doch noch ein Problem, vielleicht kann mir jemand helfen. Die Sortierabfrage sortiert nur die Ausgabezeilen der Tabelle. Die XML-Datei ist davon unberührt (In meinem bisherigen Beispiel hatte ich nur mit einer sortierten Datenquelle zu tun), leider sind die Ausgangsdaten unsortiert. Kann ich die Quelldaten sortieren, z.B. zwischenspeichern? oder wie muss ich vorgehen?