aedu: Mehrere Tabellen untereinander

Hallo Zusammen!

Ich befinde mich zur Zeit in einem Projekt, bei welchem ich Messdaten in Tabellenform Browserfähig machen muss. Nun, am einfachsten geht das für mich mit XML, jedoch grüble ich seit mehreren Stunden daran, wie ich mehrere Tabellen machen kann im XSL? Die Lösung ist bestimmt ganz einfach, aber da ich das erste Mal mit XML arbeite, bin ich überfordert.

Hier mein XML:

<?xml version='1.0' encoding='ISO-8859-1'?>
<!DOCTYPE NAME SYSTEM 'xmldefinition.dtd'>
<?xml-stylesheet type='text/xsl' href='xslstylesheet.xsl' ?>
<Measure>
<Head>
<Program>Ausgeführtes Program: SelbsttestPATEM</Program>
<Date>Ausgeführt am: 8.4.2008</Date>
<Time>Zeit: 13.16.40</Time>
<Line>________________________________________</Line>
</Head>
<Bool>

<BLabel>TEST1</BLabel>
 <BComment></BComment>
 <BRequiredValue>1</BRequiredValue>
 <BUnit></BUnit>
 <BType>Bool</BType>
 <BMeasPoint></BMeasPoint>
 <BMeasValue>0</BMeasValue>
        <BResult>FAIL</BResult>
        <BMeasTime>00:01:05</BMeasTime>

</Bool>

<Dec>

<Label>TEST2</Label>
 <Comment></Comment>
 <TolMin>gut</TolMin>
 <TolMax></TolMax>
 <Unit></Unit>
 <Type>String</Type>
 <MeasPoint></MeasPoint>
 <MeasValue>gut</MeasValue>
        <Result>PASS</Result>
        <MeasTime>00:00:36</MeasTime>

</Dec>
</Measure>

So: Nun möchte ich Boolsche Messwerte getrennt von Decmesswerten in einer einzelnen Tabelle anzeigen. Ich habe dazu folgendes XSL-Konstrukt. (Halt etwas Lang):)

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<!--Header ausgeben-->

<xsl:template xmlns:xsl="http://www.w3.org/TR/WD-xsl">
 <html>
 <body>
 <p align="left" style="font-family:Tahoma; font-size:20px; color:black">
  <xsl:value-of select="Program"/>
  </p>
  <p align="left" style="font-family:Tahoma; font-size:12px; color:black">
  <xsl:value-of select="Date"/>
  </p>
  <p align="left" style="font-family:Tahoma; font-size:12px; color:black">
  <xsl:value-of select="Time"/>
  </p>
  <p align="left" style="font-family:Tahoma; font-size:12px; color:black">
  <xsl:value-of select="Line"/>
  </p>
</body>
 </html>
</xsl:template>

<!--Header ausgeben fertig-->

<xsl:template match="/">
  <TABLE border="2pt" border-color="red">
   <TR STYLE="font-size:10pt; color:black">
    <TD>Messname</TD>
    <TD>Messtyp</TD>
    <td>Messzeit</td>
    <td>Kommentar</td>
    <td>Sollwert</td>
    <td>Istwert</td>
    <td>Pass/Fail</td>
   </TR>
   xsl:apply-templates/
  </TABLE>
 </xsl:template>

xsl:template  match="Measure"
 <xsl:for-each select="Bool">
  <TR STYLE="font-size:10pt; color:black">
   <TD>
    <xsl:value-of select="BLabel"/>
   </TD>
   <TD>
    <xsl:value-of select="BType"/>
   </TD>
   <TD>
    <xsl:value-of select="BMeasTime"/>
   </TD>
   <TD>
    <xsl:value-of select="BComment"/>
   </TD>
   <TD>
    <xsl:value-of select="BRequiredValue"/>
   </TD>
   <TD>
    <xsl:value-of select="BMeasValue"/>
   </TD>
   <TD>
    <xsl:value-of select="BResult"/>
   </TD>
  </TR>
 </xsl:for-each>
xsl:apply-templates/
</xsl:template>

<xsl:template match="/">
<TABLE border="2pt" border-color="red">
   <TR STYLE="font-size:10pt; color:black">
    <TD>Messname</TD>
    <TD>Messtyp</TD>
    <td>Messzeit</td>
    <td>Kommentar</td>
    <td>Untere Toleranz</td>
    <td>Istwert</td>
    <td>Obere Toleranz</td>
    <td>Pass/Fail</td>
   </TR>
   xsl:apply-templates/
  </TABLE>
</xsl:template>

xsl:template  match="Measure"
 <xsl:for-each select="Dec">
  <TR STYLE="font-size:10pt; color:black">
   <TD>
    <xsl:value-of select="Label"/>
   </TD>
   <TD>
    <xsl:value-of select="Type"/>
   </TD>
   <TD>
    <xsl:value-of select="MeasTime"/>
   </TD>
   <TD>
    <xsl:value-of select="Comment"/>
   </TD>
   <TD>
    <xsl:value-of select="TolMin"/>
   </TD>
   <TD>
    <xsl:value-of select="MeasValue"/>
   </TD>
   <TD>
    <xsl:value-of select="TolMax"/>
   </TD>
   <TD>
    <xsl:value-of select="Result"/>
   </TD>
  </TR>
 </xsl:for-each>
xsl:apply-templates/
</xsl:template>

</xsl:stylesheet>

Jedoch wird auf diese Weise immer bloss die Dec- Tabelle angezeigt:S Meine Nerven liegen blank;) Kann mir jemand von euch weiterhelfen?

Besten Dank im voraus

  1. Hi aedu!

    Zunächst nur so: wurde das xml mit measurement studio/cvi erstellt (rein private Neugier)?

    Nun aber zum Thema:

    <xsl:template match="/">

    bedeutet stets, dass dieses Template auf den (xml) Dokument root Knoten anzuwenden ist, also bei dir auf den <Measure> Knoten.

    Also:
    xsl:stylesheet

    <xsl:template match="/">
    <html>
     <head>
      <title>auswertung</title>

    <style type="text/css">
       .headstuff {text-align:left; font-family:Tahoma; font-size:12px; color:black;}
       .trstuff {font-size:10pt; color:black;}
      </style>
     </head>

    <body>
      <p class="headstuff">
        <xsl:value-of select="./head/Program"/>
      </p>
      <p class="headstuff">
        <xsl:value-of select="./head/Date"/>
      </p>
      <p class="headstuff">
        <xsl:value-of select="./head/Time"/>
      </p>
      <p class="headstuff">
        <xsl:value-of select="./head/Line"/>
      </p>
      xsl:commentDie folgende Zeile an die Position setzen, an der die Tabellen entstehen sollen; hier wird nun nach weiteren templates gesucht, die auf Knoten passen und diese werden "gestylt"</xsl:comment>

    <table border="2pt" border-color="red">
       <tr class="trstuff">
        <td>Messname</td>
        <td>Messtyp</td>
        <td>Messzeit</td>
        <td>Kommentar</td>
        <td>Sollwert</td>
        <td>Istwert</td>
        <td>Pass/Fail</td>
       </tr>
       <xsl:for-each select="./Bool">
         <tr class="trstuff">
           <xsl:call-template name="Bool" />
         </tr>
       </xsl:for-each>
      </table>

    <table border="2pt" border-color="red">
       <tr class="trstuff">
        <td>Messname</td>
        <td>Messtyp</td>
        <td>Messzeit</td>
        <td>Kommentar</td>
        <td>Untere Toleranz</td>
        <td>Istwert</td>
        <td>Obere Toleranz</td>
        <td>Pass/Fail</td>
       </tr>
       <xsl:for-each select="./Dec">
         <tr class="trstuff">
           <xsl:call-template name="Dec" />
         </tr>
       </xsl:for-each>
      </table>

    </body>
    </html>

    <xsl:template name="./Bool">
       <td>
        <xsl:value-of select="./BLabel"/>
       </td>
       <td>
        <xsl:value-of select="./BType"/>
       </td>
       <td>
        <xsl:value-of select="./BMeasTime"/>
       </td>
       <td>
        <xsl:value-of select="./BComment"/>
       </td>
       <td>
        <xsl:value-of select="./BRequiredValue"/>
       </td>
       <td>
        <xsl:value-of select="./BMeasValue"/>
       </td>
       <td>
        <xsl:value-of select="./BResult"/>
       </td>
    </xsl:template>

    <xsl:template name="Dec">
       <td>
        <xsl:value-of select="./Label"/>
       </td>
       <td>
        <xsl:value-of select="./Type"/>
       </td>
       <td>
        <xsl:value-of select="./MeasTime"/>
       </td>
       <td>
        <xsl:value-of select="./Comment"/>
       </td>
       <td>
        <xsl:value-of select="./TolMin"/>
       </td>
       <td>
        <xsl:value-of select="./MeasValue"/>
       </td>
       <td>
        <xsl:value-of select="./TolMax"/>
       </td>
       <td>
        <xsl:value-of select="./Result"/>
       </td>
    </xsl:template>

    </xsl:stylesheet>

    Grüsse,
    Richard

    1. Hallo Richard!

      Vielen Dank für deine schnelle Antwort! So funktionierts! Du hast mich vor dem "Bildschirm-aus-dem-Fenster-werfen" bewahrt;) Vielen Dank!

      Ja, die XML-Datei habe ich mit LabWindows CVI erstellt, woran hast du dies erkennt?

      Grüsse
      aedu

  2. Zusätzlich zum Vorposter:

    Du kannst auch alles in einem template lassen. Mehrere Templates eignen sich nur, um besseren überblick zu bewahren und auch etwas strukturierter zu arbeiten. Ich denke du solltest am besten von Anfang an versuchen, die XPath regeln bzw. Ausdrücke zu verstehen. Anbei ein Spreadsheet das alles in einem Template verarbeitet, wie gesagt Geschmackssache und viele Wege fuehren nach Rom, sollte deine Auswertung größer werden, sollten auch eine bessere struktur in das stylesheet.

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
        <xsl:output method="html"/>
        <xsl:template match="/">
            <html>
                <head/>
                <body>
                    <p align="left" style="font-family:Tahoma; font-size:20px; color:black">
                        <xsl:value-of select="Measure/Head/Program"/>
                    </p>
                    <p align="left" style="font-family:Tahoma; font-size:12px; color:black">
                        <xsl:value-of select="Measure/Head/Date"/>
                    </p>
                    <p align="left" style="font-family:Tahoma; font-size:12px; color:black">
                        <xsl:value-of select="Measure/Head/Time"/>
                    </p>
                    <p align="left" style="font-family:Tahoma; font-size:12px; color:black">
                        <xsl:value-of select="Measure/Head/Line"/>
                    </p>
                    <TABLE border="2pt" border-color="red">
                        <TR STYLE="font-size:10pt; color:black">
                            <TD>Messname</TD>
                            <TD>Messtyp</TD>
                            <td>Messzeit</td>
                            <td>Kommentar</td>
                            <td>Sollwert</td>
                            <td>Istwert</td>
                            <td>Pass/Fail</td>
                        </TR>
                        <xsl:for-each select="Measure/Bool">
                            <TR STYLE="font-size:10pt; color:black">
                                <TD>
                                    <xsl:value-of select="BLabel"/>
                                </TD>
                                <TD>
                                    <xsl:value-of select="BType"/>
                                </TD>
                                <TD>
                                    <xsl:value-of select="BMeasTime"/>
                                </TD>
                                <TD>
                                    <xsl:value-of select="BComment"/>
                                </TD>
                                <TD>
                                    <xsl:value-of select="BRequiredValue"/>
                                </TD>
                                <TD>
                                    <xsl:value-of select="BMeasValue"/>
                                </TD>
                                <TD>
                                    <xsl:value-of select="BResult"/>
                                </TD>
                            </TR>
                        </xsl:for-each>
                    </TABLE>
                    <br/>
                    <TABLE border="2pt" border-color="red">
                        <TR STYLE="font-size:10pt; color:black">
                            <TD>Messname</TD>
                            <TD>Messtyp</TD>
                            <td>Messzeit</td>
                            <td>Kommentar</td>
                            <td>Untere Toleranz</td>
                            <td>Istwert</td>
                            <td>Obere Toleranz</td>
                            <td>Pass/Fail</td>
                        </TR>
                        <xsl:for-each select="Measure/Dec">
                            <TR STYLE="font-size:10pt; color:black">
                                <TD>
                                    <xsl:value-of select="Label"/>
                                </TD>
                                <TD>
                                    <xsl:value-of select="Type"/>
                                </TD>
                                <TD>
                                    <xsl:value-of select="MeasTime"/>
                                </TD>
                                <TD>
                                    <xsl:value-of select="Comment"/>
                                </TD>
                                <TD>
                                    <xsl:value-of select="TolMin"/>
                                </TD>
                                <TD>
                                    <xsl:value-of select="MeasValue"/>
                                </TD>
                                <TD>
                                    <xsl:value-of select="TolMax"/>
                                </TD>
                                <TD>
                                    <xsl:value-of select="Result"/>
                                </TD>
                            </TR>
                        </xsl:for-each>
                    </TABLE>
                </body>
            </html>
        </xsl:template>
    </xsl:stylesheet>