Announcement

Collapse
No announcement yet.

XML nach HTML-Unbekannte Knotennamen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • XML nach HTML-Unbekannte Knotennamen

    Hallo,

    ich bekommen von der Datenbank ein XML in dieser Form:
    Code:
    <ROWSET>
     <ROW>
      <VORNAME>Peter</VORNAME>
      <NAME>Schmidt</NAME>
      <FELD1>Eins</FELD1>
      <FELD2>Zwei</FELD2>
     </ROW>
     <ROW>
      <VORNAME>Klaus</VORNAME>
      <NAME>Mueller</NAME>
      <FELD1>Eins</FELD1>
      <FELD2>Zwei</FELD2>
     </ROW>
    [...]
    </ROWSET>
    Das Ergebnis ist abhängig von der SQL-Abfrage die ich stelle. Das heißt: <ROWSET> und <ROW> kommt immer im XML vor, die Felder darunter können in der Anzahl und im Namen variiren, da es die Datenbankfelder aus der Query sind.

    Ich möchte gerne ein Universeles XSLT haben, dass mir unabhängig vom Namen und Anzahl der Felder eine HTML-Tabelle ausgibt. Jedes <ROW> Element ergibt eine Zeile der Tabelle. Die Felder sind jeweils eine Spalte.

    Ich habe stundenlang gegoogelt, aber leider nichts brauchbares gefunden. Hat jemand von euch schon mal so etwas geschrieben?

    Vielen Dank im Voraus
    Alfonso

  • #2
    Greife die unbekannten Kindelemente mit "*" ab und die Feldnamen über local-name():
    Code:
    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    
      <xsl:output method="html" encoding="UTF-8" indent="yes"/>
    
      <xsl:template match="ROWSET">
        <html>
          <head>
            <title>Test</title>
          </head>
          <body>
            <table>
              <thead>
                <tr>
                  <xsl:for-each select="ROW[1]/*">
                    <th><xsl:value-of select="local-name()"/></th>          
                  </xsl:for-each>
                </tr>
              </thead>
              <tbody>
                <xsl:apply-templates select="ROW"/>
              </tbody>
            </table>    
          </body>
        </html>
      </xsl:template>
    
      <xsl:template match="ROW">
        <tr>
          <xsl:for-each select="*">
            <td><xsl:value-of select="."/></td>
          </xsl:for-each>
        </tr> 
      </xsl:template>
    
    </xsl:stylesheet>
    Im Beispiel werden die Feldnamen des ersten ROW-Elements für die Spaltenköpfe verwendet (sinnvoll, sofern sich die Struktur wiederholt).

    Comment


    • #3
      Vielen dank! Genau richtig. XSL ist genial!

      Comment


      • #4
        Basieren auf obiges XSL habe ich mit Zahlen mit Nachkommastellen ein Problem:
        Code:
        <ROWSET>
         <ROW>
          <VORNAME>Peter</VORNAME>
          <NAME>Schmidt</NAME>
          <UMSATZ>12345.67<UMSATZ>
          <FELD1>Eins</FELD1>
          <FELD2>Zwei</FELD2>
         </ROW>
        [...]
        </ROWSET>
        Das Feld Umsatz wird ausgegeben als <td>12345.67</td>, was aber mir mit der Weiterverarbeitung in Excel ein Problem macht. Korrekt müssten Zahlen anstatt ein . ein , haben, also <td>12345,67</td>.
        Gibt es die Möglichkeit
        1.) eine Zahl von . auf , umzuwandeln.
        2.) Dieses im obigem XSL einzubauen, so dass es für alle Zahlen gilt? Wie ich im Anfangsthread sagte: Ich weis nicht, wie die Namen der Felder heisen noch welches Datenformat sie haben. Das XML wird aus Oracle generiert.

        Danke im Voraus

        Comment


        • #5
          Prüfe mit number() auf numerischen Inhalt und verwende translate() zur Umwandlung von Dezimalpunkt in Komma:
          Code:
          <xsl:template match="ROW">
            <tr>
              <xsl:for-each select="*">
                <td>
                  <xsl:choose>
                    <xsl:when test="number(.)"><xsl:value-of select="translate(.,'.',',')"/></xsl:when>
                    <xsl:otherwise><xsl:value-of select="."/></xsl:otherwise>
                  </xsl:choose>
                </td>
              </xsl:for-each>
            </tr> 
          </xsl:template>

          Comment


          • #6
            Fantastisch!
            Ich werde jetzt vielleicht noch unverschämt, aber wie erreiche ich jetzt eine Formatierung mit Tausendertrennzeichen?

            Gruß und danke
            Alfonso

            Comment


            • #7
              Siehe format-number().

              Comment

              Working...
              X