Announcement

Collapse
No announcement yet.

Zuordnung von Spaltennamen in XSLT 1.0

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

  • Zuordnung von Spaltennamen in XSLT 1.0

    Guten Tag,


    ich erhalte aus einer SOAP-Antwort folgendes XML zurück, was ich gerne mittels XSLT 1.0 (leider obligatorisch) zu einer tabellarischen HTML-Ausgabe transformieren möchte:

    HTML Code:
       <root>         
            <return>
                <event>
                   <keyvalue>
                      <key>TIMESTAMP</key>
                      <value>text</value>
                   </keyvalue>
                   <keyvalue>
                     <key>PRIORITY</key>
                     <value>text</value>
                   </keyvalue>
                   <keyvalue>
                      <key>STATUS</key>
                      <value>text</value>
                   </keyvalue>
                   <keyvalue>
                      <key>ID</key>
                      <value>text</value>
                   </keyvalue>
                   <keyvalue>
                      <key>DESCRIPTION</key>
                      <value>text</value>
                   </keyvalue>
                </event>
             </return>
             <return>
                <event>
                   <keyvalue>
                      <key>GENERIC</key>
                      <value>text</value>
                   </keyvalue>
                   <keyvalue>
                      <key>ID_TYPE</key>
                      <value>text</value>
                   </keyvalue>
                   <keyvalue>
                      <key>TIMESTAMP</key>
                      <value>text</value>
                   </keyvalue>
                   <keyvalue>
                      <key>STATUS</key>
                      <value>text</value>
                   </keyvalue>
                   <keyvalue>
                      <key>TYPE</key>
                      <value>text</value>
                   </keyvalue>
                   <keyvalue>
                      <key>CATEGORY</key>
                      <value>text</value>
                   </keyvalue>
                   <keyvalue>
                      <key>DESCRIPTION</key>
                      <value>text</value>
                   </keyvalue>
                   <keyvalue>
                      <key>ID</key>
                      <value>text</value>
                   </keyvalue>
                   <keyvalue>
                      <key>PRIORITY</key>
                      <value>text</value>
                   </keyvalue>
                </event>
             </return>
        <root>
    Für jedes <root> existieren beliebig viele <return>-Elemente, die genau einen <event>-Eintrag beinhalten. Jedes <event> kann wiederum beliebig viele und vor allem reihenfolgenunabhänge <keyvalue>-Tags enthalten, die wiederum genau einen <key> und einen <value> enthalten.

    Das Problem ist, dass ich das in einer Tabelle darstellen will, jedoch nur folgende <key>-Elemente als Überschriften und die entsprechenden <value>-Werte in den dazu passenden Tabellenzellen benötige:

    TIMESTAMP | PRIORITY | STATUS | ID | DESCRIPTION
    --------------------------------------------------------------------------
    Daten des 1. <event>-Datensatzes pro Spalte
    --------------------------------------------------------------------------
    Daten des 2. <event>-Datensatzes pro Spalte
    -------------------------------------------------------------------------
    ... und so weiter...


    Der ganze Rest (GENERIC, TYPE, ID_TYPE, CATEGORY und viele weitere...) soll ignoriert und nicht ausgegeben werden. Sollte ein <event>-Element eine der erwünschten Überschriften gar nicht als Schlüssel-Wert-Paar haben, so soll die entsprechende Tabellenzelle einfach leer bleiben.

    Wenn alles immer in der richtigen Reihenfolge und jedes <event> identische <keyvalue>-Felder hätte, wäre das kein Problem, aber so "verrutschen" mir immer die Spalten... Gibt es dafür einen Ansatz?

    Besten Dank im Voraus!

    Philipp

  • #2
    Hier ist ein Ansatz:
    Code:
    <xsl:stylesheet
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:data="http://example.com/data"
      exclude-result-prefixes="data"
      version="1.0">
      
      <xsl:output method="html" indent="yes"/>
      
      <data:data xmlns="">
        <col>TIMESTAMP</col>
        <col>PRIORITY</col>
        <col>STATUS</col>
        <col>ID</col>
        <col>DESCRIPTION</col>
      </data:data>
      
      <xsl:variable name="col-names" select="document('')/xsl:stylesheet/data:data/col"/>
      
      <xsl:template match="/">
        <html>
          <body>
            <xsl:apply-templates/>
          </body>
        </html>
      </xsl:template>
      
      <xsl:template match="root">
        <table>
          <thead>
            <tr>
              <xsl:apply-templates select="$col-names"/>
            </tr>
          </thead>
          <tbody>
            <xsl:apply-templates select="return/event"/>
          </tbody>
        </table>
      </xsl:template>
      
      <xsl:template match="col">
        <th>
          <xsl:value-of select="."/>
        </th>
      </xsl:template>
      
      <xsl:template match="return/event">
        <tr>
          <xsl:variable name="evt" select="."/>
          <xsl:for-each select="$col-names">
            <td>
              <xsl:value-of select="$evt/keyvalue[key = current()]/value"/>
            </td>
          </xsl:for-each>
        </tr>
      </xsl:template>
      
    </xsl:stylesheet>

    Comment


    • #3
      Super, vielen Dank! Das hilft mir schon sehr weiter, die Integration ins vorhandene Stylesheet kriege ich jetzt wohl hin, da wird effektiv nur noch kontextabhängig "aufgehübscht".

      Ich wundere mich ein wenig, dass dieses Forum teilweise sehr verwaiste Bereiche hat, wo es doch so kompetente Leute gibt...

      Beste Grüße!

      Philipp

      Comment

      Working...
      X