Daniel_F: XML mit XSLT in HTML Ausgeben

hallo zusammen,

Also ich habe folgendes Problem, ich soll ein Datensätze aus einer SQL Server Datebank diret über ASP.NET in XML format in den Browser schreiben ohne das ich diese Datei speichere, was auch problemlos klappt. Mein Problem ist es nun dieses XML über XSLT als HTML im Browser in einer Tabelle auszugeben und eine Überprüfung zu machen das nur bestimmte Daten in bestimmte Spalten/Reihe reingeschrieben werden dürfen.
Jetzt meine Frage ist dies mit XSLT überhaupt möglich vieleicht mit den xsl:if oder xsl:choose funtkionstüchtig machen?.

Vieleicht kann mir ja einer ein ansatz geben wie ich dies hin bekomme hab grad mit XML etc. angefangen also noch am anfänger.

Gruß Daniel

  1. Hallo,

    Also ich habe folgendes Problem,[...] HTML im Browser in einer Tabelle auszugeben und eine Überprüfung zu machen das nur bestimmte Daten in bestimmte Spalten/Reihe reingeschrieben werden dürfen.
    Jetzt meine Frage ist dies mit XSLT überhaupt möglich vieleicht mit den xsl:if oder xsl:choose funtkionstüchtig machen?.

    Ja, das ist mit XSLT möglich, aber mehr kann man dir erst nur dann sagen, wenn du ein Strück aus deinem XML (es müssen nicht echte Daten sein, aber das Bsp. soll schon so strukturiert sein wie das Original) und von deinem XSLT (oder eine Erklärung wie die gewünsche Ausgabe aussehen soll) uns gibst.

    Grüße
    Thomas

    1. Hi ok dann weis ich ja schon mal das ich nicht ganz falsch liege :D

      also hier ist ein teil der xml datei
      <?xml version="1.0" standalone="yes"?>

      <?xml-stylesheet type="text/xsl" href="XSLTFile.xsl"?>
      <NewDataSet>
        <Spielzug>
          <Spiel_ID>1</Spiel_ID>
          <Spalte>1</Spalte>
          <Spieler>false</Spieler>
          <Reihe>0</Reihe>
        </Spielzug>
        <Spielzug>
          <Spiel_ID>1</Spiel_ID>
          <Spalte>1</Spalte>
          <Spieler>true</Spieler>
          <Reihe>1</Reihe>
        </Spielzug>
      </NewDataSet>

      Also mein Ziel ist es das Attribut Spieler in einer Tabellenspalte auszugeben, diese Tabellenspalte soll dann z.B für Spieler (False)(erster Datensatz) in der Tabellespalte 1 und Reihe 1 drin stehen.

      hoffe du verstehst was ich meine
      und danke für die schnelle antwort

      Gruß Daniel

      1. Hallo,

        also hier ist ein teil der xml datei
        <?xml version="1.0" standalone="yes"?>

        <?xml-stylesheet type="text/xsl" href="XSLTFile.xsl"?>
        <NewDataSet>
          <Spielzug>
            <Spiel_ID>1</Spiel_ID>
            <Spalte>1</Spalte>
            <Spieler>false</Spieler>
            <Reihe>0</Reihe>
          </Spielzug>
          <Spielzug>
            <Spiel_ID>1</Spiel_ID>
            <Spalte>1</Spalte>
            <Spieler>true</Spieler>
            <Reihe>1</Reihe>
          </Spielzug>
        </NewDataSet>

        Also mein Ziel ist es das Attribut Spieler in einer Tabellenspalte auszugeben, diese Tabellenspalte soll dann z.B für Spieler (False)(erster Datensatz) in der Tabellespalte 1 und Reihe 1 drin stehen.

        hoffe du verstehst was ich meine

        Ich hoffe, dass ich dich jetztrichtig verstanden habe:

        ------------- xslt-datei ----------------------
        <?xml version="1.0" encoding="iso-8859-1"?>
        <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="html" indent="yes" encoding="iso-8859-1" />
        <xsl:template match="/">
         <html>
          <head>
           <title>Untitled</title>
          </head>
          <body>
           <xsl:apply-templates />
          </body>
         </html>
        </xsl:template>
        <xsl:template match="NewDataSet">
         <table>
          <tr>
           <th>Spiel-ID</th>
           <th>Spieler</th>
          </tr>
          <xsl:for-each select="Spielzug">
           <tr>
            <td>
             <xsl:value-of select="Spiel_ID" />
            </td>
            <td>
             <xsl:value-of select="Spieler" />
            </td>
           </tr>
          </xsl:for-each>
         </table>
        </xsl:template>
        </xsl:stylesheet>

        Grüße
        Thomas

        1. Also damit krieg ich den rest auch alleine hin ;D
          muss nur noch die Tabelle richtig ordnenen aber vielen danke für deine schnelle hilfe hat mir echt geholfen vielen dank

          Gruß Daniel

          1. eins vieleicht noch hab jetzt schon auf mehreren Seiten dannach gesucht und nix gefunden weist du vieleicht ob ich mit dem
            xsl:if 2 bedingungen abfragen kann weil das klappt bei mir noch nicht richtig als Beispiel

            oben template...

            <xsl:if test="Spielzug/Spalte = 103 and Spielzug/Reihe = 1">

            rest vom template unwichtig...

            ob sowas in der art möglich ist weil so wie das oben steht klappt das bei mir nicht und ich finde auch kein geignetes Beispiel dafür :(

            Gruß Daniel

            1. Also mit xsl:if kannst du beliebig viele Bedingungen setzen. Aber du muesstest etwas näher angeben, was du mit der Abfrage erreichen möchtest. Vielleicht einen größeren Auschnitt der xml posten und das gewünschte Ergebnis umschreiben ?

              1. Also mit xsl:if kannst du beliebig viele Bedingungen setzen. Aber du muesstest etwas näher angeben, was du mit der Abfrage erreichen möchtest. Vielleicht einen größeren Auschnitt der xml posten und das gewünschte Ergebnis umschreiben ?

                also die werte die im obrigen post stehen müssten glaub ich reichen weil ich versuche nur ein bedinung zu schreiben mit der ich Spieler aus geben will also True oder False aber nur den Spieler mit den Spalten 103 und Reihe 2 z.B und dann funktioniert mit xsl:if nicht aber ich hab irgendwo was gelesen das man das direkt mit xsl:value-of select="Spielzug/Spieler[Spielzug/Spalte = 103 and Spielzug/Reihe = 2]">

                so machen kann aber da bekomm ich dann garnichts raus ist alles bissel komisch ;/

                wenn oben das nicht reicht kann ich auch grad mehr von der xml datei posten:

                XML Datei:
                <NewDataSet>
                  <Spielzug Spiel_ID="1">
                    <Spalte>103</Spalte>
                    <Spieler>false</Spieler>
                    <Reihe>0</Reihe>
                  </Spielzug>
                  <Spielzug Spiel_ID="1">
                 <Spalte>103</Spalte>
                    <Spieler>true</Spieler>
                    <Reihe>1</Reihe>
                  </Spielzug>
                  <Spielzug Spiel_ID="1">
                    <Spalte>103</Spalte>
                    <Spieler>false</Spieler>
                    <Reihe>2</Reihe>
                  </Spielzug>
                  <Spielzug Spiel_ID="1">
                    <Spalte>104</Spalte>
                    <Spieler>true</Spieler>
                    <Reihe>0</Reihe>
                  </Spielzug>
                  <Spielzug>
                    <Spalte>104</Spalte>
                    <Spieler>false</Spieler>
                    <Reihe>1</Reihe>
                  </Spielzug>
                  <Spielzug Spiel_ID="1">
                   <Spalte>104</Spalte>
                    <Spieler>true</Spieler>
                    <Reihe>2</Reihe>
                  </Spielzug>
                  <Spielzug Spiel_ID="1">
                    <Spalte>104</Spalte>
                    <Spieler>true</Spieler>
                    <Reihe>3</Reihe>
                  </Spielzug>
                  <Spielzug Spiel_ID="1">
                    <Spalte>104</Spalte>
                    <Spieler>false</Spieler>
                    <Reihe>4</Reihe>
                  </Spielzug>
                  <Spielzug Spiel_ID="1">
                    <Spalte>105</Spalte>
                    <Spieler>true</Spieler>
                    <Reihe>0</Reihe>
                  </Spielzug>
                  <Spielzug Spiel_ID="1">
                    <Spalte>105</Spalte>
                    <Spieler>false</Spieler>
                    <Reihe>1</Reihe>
                  </Spielzug>
                  <Spielzug Spiel_ID="1">
                    <Spalte>105</Spalte>
                    <Spieler>true</Spieler>
                    <Reihe>2</Reihe>
                  </Spielzug>
                  <Spielzug Spiel_ID="1">
                    <Spalte>106</Spalte>
                    <Spieler>false</Spieler>
                    <Reihe>0</Reihe>
                  </Spielzug>
                  <Spielzug Spiel_ID="1">
                    <Spalte>106</Spalte>
                    <Spieler>false</Spieler>
                    <Reihe>1</Reihe>
                  </Spielzug>
                </NewDataSet>

                1. Hallo

                  also die werte die im obrigen post stehen müssten glaub ich reichen weil ich versuche nur ein bedinung zu schreiben mit der ich Spieler aus geben will also True oder False aber nur den Spieler mit den Spalten 103 und Reihe 2 z.B und dann funktioniert mit xsl:if nicht aber ich hab irgendwo was gelesen das man das direkt mit xsl:value-of select="Spielzug/Spieler[Spielzug/Spalte = 103 and Spielzug/Reihe = 2]">

                  Das ist Richtig, viele Wege führen nach Rom ;-) Alternative 1:

                  <?xml version="1.0" encoding="iso-8859-1"?>
                  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                      <xsl:output method="html" indent="yes" encoding="iso-8859-1" />
                      <xsl:template match="/">
                          <html>
                              <head>
                                  <title>Untitled</title>
                              </head>
                              <body>
                                  <xsl:apply-templates />
                              </body>
                          </html>
                      </xsl:template>
                      <xsl:template match="NewDataSet">
                          <table>
                              <tr>
                                  <th>Spiel-ID</th>
                                  <th>Spieler</th>
                              </tr>
                              <xsl:for-each select="Spielzug[(descendant::Spalte=103) and (descendant::Reihe=2)]">
                  <!-- du koenntest auch schreiben <xsl:for-each select="Spielzug[Spalte=103 and Reihe=2]"> -->
                                  <tr>
                                      <td>
                                          <xsl:value-of select="@Spiel_ID" />
                                      </td>
                                      <td>
                                          <xsl:value-of select="Spieler" />
                                      </td>
                                  </tr>
                              </xsl:for-each>
                          </table>
                      </xsl:template>
                  </xsl:stylesheet>

                  Alternative 2 mit xsl:if:

                  <?xml version="1.0" encoding="iso-8859-1"?>
                  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                      <xsl:output method="html" indent="yes" encoding="iso-8859-1" />
                      <xsl:template match="/">
                          <html>
                              <head>
                                  <title>Untitled</title>
                              </head>
                              <body>
                                  <xsl:apply-templates />
                              </body>
                          </html>
                      </xsl:template>
                      <xsl:template match="NewDataSet">
                          <table>
                              <tr>
                                  <th>Spiel-ID</th>
                                  <th>Spieler</th>
                              </tr>
                              <xsl:for-each select="Spielzug">
                                  <xsl:if test="Spalte = 103 and Reihe = 2">
                                  <tr>
                                      <td>
                                          <xsl:value-of select="@Spiel_ID" />
                                      </td>
                                      <td>
                                          <xsl:value-of select="Spieler" />
                                      </td>
                                  </tr>
                                  </xsl:if>
                              </xsl:for-each>
                          </table>
                      </xsl:template>
                  </xsl:stylesheet>

                  Alternative 1 ist m.E. vorzuziehen, da diese performanter ist.

                  Gruß,

                  Holger

                  1. Alternative 1 ist m.E. vorzuziehen, da diese performanter ist.

                    cool danke werde glaub ich auch mit der ersten Alternative weiter machen vielen danke für eure hilfe hat mir echt geholfen :D

                    Gruß Dani

                2. Hallo,

                  aber ich hab irgendwo was gelesen das man das direkt mit xsl:value-of select="Spielzug/Spieler[Spielzug/Spalte = 103 and Spielzug/Reihe = 2]">

                  so machen kann aber da bekomm ich dann garnichts raus

                  Das ist kein Wunder, wenn du folgendes bedenkst:

                  <xsl:value-of select="Spielzug/Spieler[Spielzug/Spalte = 103 and Spielzug/Reihe = 2]">

                  Du greifst auf ein Spieler-Elemente, wenn es selbst ein Spielzeug-Element, dessen Spalte-Element 103 bzw. dessen Reihe-Element 2 ist, enthält, in einem Spielzeug-Element.

                  In XML:

                  <Spielzug>
                    <Spieler>
                       <Spielzug>
                           <Spalte>
                           <Reihe>
                     --------------

                  Die Lösungen hat dir schon "hh" gepostet.

                  Grüße
                  Thomas

            2. Hallo,

              eins vieleicht noch hab jetzt schon auf mehreren Seiten dannach gesucht und nix gefunden weist du vieleicht ob ich mit dem
              xsl:if 2 bedingungen abfragen kann weil das klappt bei mir noch nicht richtig als Beispiel

              oben template...

              <xsl:if test="Spielzug/Spalte = 103 and Spielzug/Reihe = 1">

              Ja das kannst du genau so machen, wobei es z.B. ein:
              <xsl:if test="(Spielzug/Spalte = 103) and (Spielzug/Reihe = 1)"> etwas schöner wäre.
              Aber es kommt darau an wo du diese Abfrage stellt, sprich ob "Spielzug/Spalte" wirklich der richtige Pfad ist.

              Grüße
              Thomas