xml, xslt in Table

mille

Erfahrenes Mitglied
moin Leute.

Ich habe mir für meinen Stundenplan (aus Übungszwecken) eine xml datei erstellt die diesem Schema genügt:
XML:
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.da-mille.de/stundenplaene"
    targetNamespace="http://www.da-mille.de/stundenplaene"
    elementFormDefault="qualified"
    attributeFormDefault="qualified">
    <xsd:element name="plan">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="block" type="blockT" maxOccurs="unbounded" />
            </xsd:sequence>
            
            <xsd:attribute name="type" type="xsd:string" />
            <xsd:attribute name="term" type="xsd:string" />
            <xsd:attribute name="number" type="xsd:integer" />
        </xsd:complexType>
    </xsd:element>
    
    <xsd:complexType name="blockT">
        <xsd:all>
            <xsd:element name="title" type="xsd:string" />
            <xsd:element name="type" type="xsd:string" />
            <xsd:element name="location" type="xsd:string" />
            <xsd:element name="lecturer" type="xsd:string" />
            <xsd:element name="hint" type="xsd:string" minOccurs="0" />
        </xsd:all>
        
        <xsd:attribute name="day">
            <xsd:simpleType>
                <xsd:restriction base="xsd:integer">
                    <xsd:minInclusive value="1" />
                    <xsd:maxInclusive value="5" />
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:attribute>
        
        <xsd:attribute name="block">
            <xsd:simpleType>
                <xsd:restriction base="xsd:integer">
                    <xsd:minInclusive value="1" />
                    <xsd:maxInclusive value="7" />
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:attribute>
        
        <xsd:attribute name="duration" use="optional">
            <xsd:simpleType>
                <xsd:restriction base="xsd:integer">
                    <xsd:minInclusive value="1" />
                    <xsd:maxInclusive value="5" />
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:attribute>
    </xsd:complexType>
</xsd:schema>

Eine entsprechende Instanz (stundenplan.xml) sieht so aus:

XML:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="transform.xsl" ?>

<plan   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="schema.xsd"
        type="university" term="winter" number="7">
    <block day="1" block="3">
        <title>Kommunikations- und Lernstrategien</title>
        <type>seminar</type>
        <location>LG3a/338</location>
        <lecturer>Dr. Hoppe / Dipl.-Ing. Binkowski</lecturer>
    </block>
    
    <block day="1" block="4">
        <title>Ringlabor eBusiness</title>
        <type>Seminar</type>
        <location>LG10/421</location>
        <lecturer>Prof. Baier</lecturer>
    </block>
    
    <block day="1" block="5">
        <title>Wissensmanagement im Unternehmen</title>
        <type>Vorlesung</type>
        <location>Naco 106</location>
        <lecturer>Prof. Meinberg / Dipl.-Ing. Siech</lecturer>
    </block>
    
    <block day="1" block="6">
        <title>Gründungsmanagement</title>
        <type>Vorlesung</type>
        <location>ZBVI.04</location>
        <lecturer>Prof. Mißler-Behr</lecturer>
    </block>
    
    <block day="2" block="4">
        <title>Gründungsmanagement</title>
        <type>Ãœbung</type>
        <location>LG3A/406</location>
        <lecturer>Schmidt</lecturer>
    </block>
    
    <block day="3" block="3">
        <title>Strategisches Management (Berücksichtigung von TIM)</title>
        <type>Vorlesung</type>
        <location>ZBVI.04</location>
        <lecturer>Prof. Mißler-Behr</lecturer>
    </block>
    
    <block day="3" block="5">
        <title>Strategisches Management (Berücksichtigung von TIM)</title>
        <type>Ãœbung</type>
        <location>ZBVI.04</location>
        <lecturer>Teusler</lecturer>
    </block>
    
    <block day="4" block="3">
        <title>Kommunikations- und Lernstrategien</title>
        <type>Vorlesung</type>
        <location>LG3A/338</location>
        <lecturer>Dr. Hoppe</lecturer>
        <hint>fachübergreifend</hint>
    </block>
    
    <block day="5" block="2" duration="2">
        <title>Kommunikations- und Netzwerkmanagement in Unternehmen</title>
        <type text="Blockveranstaltung(VL/UE)">Seminar</type>
        <location>LG3A/338</location>
        <lecturer>Dr. Hoppe</lecturer>
        <hint>nur A Woche</hint>
    </block>
</plan>


Hieraus hätte ich gerne einen html mit XSLT erstellt, die eine Ausgabe wie diese erzeugt:
HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Unbenanntes Dokument</title>
<style type="text/css">
<!--
.uebung { background-color: #6B8F61;}
.vorlesung {background-color: #89A4B4; }
.seminar { background-color: #BAA57C;}
EM { font-weight:bold; color: #333; margin-bottom: 10px; display: block;}
BODY, TABLE, TR, TD { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: #000; vertical-align: top; }
.desc { font-weight: bold; color: #000; }
h1 { font-size: 14px; font-family: Verdana, Arial, Helvetica, sans-serif; font-weight: bold; }
h2 { font-size: 11px; font-style: italic; }
-->
</style>
</head>

<body>
<table width="1000" border="1" cellpadding="1" bordercolor="#000000" style="border-collapse: collapse">
  <tbody>
    <tr>
      <td width="10%" height="35" class="desc">Zeit </td>
      <td width="18%" class="desc">Montag </td>
      <td width="18%" class="desc">Dienstag </td>
      <td width="18%" class="desc">Mittwoch </td>
      <td width="18%" class="desc">Donnerstag </td>
      <td width="18%" class="desc">Freitag </td>
    </tr>
    <tr>
      <td height="80" class="desc">07.30-<br />
      09.00 </td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
    <tr>
      <td height="80" class="desc">09.15-<br />
      10.45 </td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
      <td rowspan="2" class="seminar">
          <em>Kooperations- und Netzwerkmanagement in Unternehmen</em>
        
        Blockveranstaltung (VL/UE) <br />
        Raum steht noch nich <br />
        Prof. Baier / Nadine Teusler <br />
        - nur A Woche -      </td>
    </tr>
    <tr>
      <td height="80" class="desc">11.30-<br />
      13.00 </td>
      <td class="seminar">
          <em>Kommunikations- und Lernstrategien (fach&uuml;)</em>
          UE/Seminar <br />
        LG3a/338 <br />
        Dr. Hoppe / Dipl.-Ing. Binkowski      </td>
      <td>&nbsp;</td>
      <td class="vorlesung">
          <em>Strategisches Management (Berücksichtigung von TIM)</em>
        VL<br />
        ZBVI.04 <br />
        Prof. Mißler-Behr      </td>
      <td class="vorlesung">
          <em>Kommunikations- und Lernstrategien (fach&uuml;)</em>
        VL <br  />
        LG3a/338 <br />
        Dr. Hoppe      </td>
    </tr>
    <tr>
      <td height="80" class="desc">13.45-<br />
      15.15 </td>
      <td class="seminar">
          <em>Ringlabor eBusiness</em>
        Seminar <br />
        LG10/421 <br />
        Prof. Baier
      </td>
      <td class="uebung">
          <em>Gr&uuml;ndungsmanagement</em>
          UE<br />
        LG3A/406<br />
        Schmidt      </td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
    <tr>
      <td height="80" class="desc">15.30-<br />
      17.00 </td>
      <td class="vorlesung">
            <em>Wissensmanagement im Unternehmen (WM)</em>
            VL <br />
            Naco 106 <br />
            Prof. Meinberg/ Dipl-Ing. Siech        </td>
      <td>&nbsp;</td>
      <td class="uebung">
          <em>Strategisches Management (Berücksichtigung von TIM)</em>
        VL<br />
        ZBVI.04 <br />
        Teusler</td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
    <tr>
      <td height="80" class="desc">17.30-<br />
      19.00 </td>
      <td class="vorlesung">
          <em>Gr&uuml;ndungsmanagement</em>
          VL<br />
        ZBVI.04<br />
        Prof. Mi&szlig;ler-Behr</td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
    <tr>
      <td height="80" class="desc">19:00-<br />
      20:30</td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
      <td>&nbsp;</td>
    </tr>
  </tbody>
</table>
<strong><strong><br />
</strong></strong>
</body>
</html>

Soweit so gut.
Ich habe mir also eine XSLT gebastelt, die im stundenplan.xml auch inkludiert wird, die folgenden Aufbau hat:
XML:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xsl:stylesheet  [
    <!ENTITY nbsp   " ">
    <!ENTITY copy   "©">
    <!ENTITY reg    "®">
    <!ENTITY trade  "™">
    <!ENTITY mdash  "—">
    <!ENTITY ldquo  "“">
    <!ENTITY rdquo  "”"> 
    <!ENTITY pound  "£">
    <!ENTITY yen    "¥">
    <!ENTITY euro   "€">
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
<xsl:key name="blocks-by-attr" match="/plan/block" use="@block" />
<xsl:template match="/plan">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Stundenplan</title>
<style type="text/css">
    .uebung { background-color: #6B8F61;}
    .vorlesung {background-color: #89A4B4; }
    .seminar { background-color: #BAA57C;}
    EM { font-weight:bold; color: #333; margin-bottom: 10px; display: block;}
    BODY, TABLE, TR, TD { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 10px; color: #000; vertical-align: top;}
    .desc { font-weight: bold; color: #000; }
    h1 { font-size: 14px; font-family: Verdana, Arial, Helvetica, sans-serif; font-weight: bold; }
    h2 { font-size: 11px; font-style: italic; }
</style>
</head>

<body>
<table width="1000" border="1" cellpadding="1" bordercolor="#000000" style="border-collapse: collapse">
  <tbody>
    <tr>
      <td width="10%" height="35" class="desc">Zeit </td>
      <td width="18%" class="desc">Montag </td>
      <td width="18%" class="desc">Dienstag </td>
      <td width="18%" class="desc">Mittwoch </td>
      <td width="18%" class="desc">Donnerstag </td>
      <td width="18%" class="desc">Freitag </td>
    </tr>
    
      <xsl:for-each select="block[count(. | key('blocks-by-attr', @block)[1]) = 1]">
         <xsl:sort select="@block" />
         <tr><td></td>
             <xsl:for-each select="key('blocks-by-attr', @block)">
                <xsl:sort select="@day" />
                <xsl:if test="number(@Day) &gt; 1"><td>&nbsp;</td></xsl:if>
                <xsl:if test="number(@Day) &gt; 2"><td>&nbsp;</td></xsl:if>
                <xsl:if test="number(@Day) &gt; 3"><td>&nbsp;</td></xsl:if>
                <xsl:if test="number(@Day) &gt; 4"><td>&nbsp;</td></xsl:if>
                <td class="{type}">
                  <em><xsl:value-of select="title" /></em>
                  <xsl:value-of select="type" /> <br />
                  <xsl:value-of select="location" /> <br />
                  <xsl:value-of select="lecturerer" />
                </td>
             </xsl:for-each>
         </tr>
      </xsl:for-each>
    
    <!--<xsl:apply-templates select="block" />
    <xsl:variable name="the_min">
     <xsl:for-each select="//@block">
           <xsl:sort data-type="number" order="ascending"/>
           <xsl:if test="position()=1">
             <xsl:value-of select="."/>
        </xsl:if>
     </xsl:for-each>
   </xsl:variable>-->
  </tbody>
</table>
</body>
</html>

</xsl:template>
</xsl:stylesheet>


soweit so gut.
Meine Ausgabe hat schon in etwa die Form die ich mir wünsche, aber nicht ganz. Ich habe 2 Probleme, bei denen ich hoffe hier Hilfe zu finden :).
1. an einer stele lese ich das Element "type" aus, um eine "class" zu setzen <td class="{type}"> (Z.56). Hierbei möchte ich gerne das die ausgabe in "lower case" ausgegeben wird - eine Verwendung von "lower-case(title)" resultiert aber in einer Fehlermeldung.
2. das Attribut "day" ist mit Zahlen versehen, wobei 1 für "montag", 2 für "dienstag" (Etc) steht. im Dokument wird nach Blöcken sortiert (Muench-Methode) und diese werden an Hand der Tage (Day) sortiert. Jetzt kommt es ja vor (ihr seht es in der html), dass es in der ganzen woche nur einen 2. Block gibt - der ist Freitags (day=5). Also brauche ich quasi eine Möglichkeit, vor der Ausgabe vom Element entsprechend häufig leere "<td></td>" zu setzen. Das wiederum funktioniert auch Prima durch meine Abfrage.
Leider aber verschiebt sich das ganze dann, wenn Montag (day=1) ein TD eingefügt werden soll und dann ein Tag frei sein soll. Insofern müsste die IF-Abfrage in der XSLT Datei Zeile 52 ja etwas nagepasst werden - etwa abhängig vom vorhergehenden Bruder.
Soll heißen:
statt "number(@Day) &gt; 1" muss eben "number(@Day) - VOM-VORGÄNGER-MIT-GLEICHER-BLOCKNUMMER(number(@da)) &gt; 1".

Versteht ihr, was ich möchte? Ich hoffe, weil drückt sich ziemlcih kompliziert aus. Aufgrund dessen habe ich auch die Wunschausgabe in HTML gepostet.

MfG
 
Zuletzt bearbeitet von einem Moderator:
Hi.
Meine Ausgabe hat schon in etwa die Form die ich mir wünsche, aber nicht ganz. Ich habe 2 Probleme, bei denen ich hoffe hier Hilfe zu finden :).
1. an einer stele lese ich das Element "type" aus, um eine "class" zu setzen <td class="{type}"> (Z.56). Hierbei möchte ich gerne das die ausgabe in "lower case" ausgegeben wird - eine Verwendung von "lower-case(title)" resultiert aber in einer Fehlermeldung.
In XPath 1.0 gibt es keine lower-case Funktion. Du kannst aber die Translate Funktion verwenden indem du einfach alle Großbuchstaben durch Kleinbuchstaben ersetzt.

Dein zweites Problem versteh ich jetzt grad nicht so ganz. Muss ich mir nochmal genauer anschauen...

Gruß
 
Hey,

Verstehst du das Problem als Problem nicht zu lösen ad hoc?
Oder
Verstehst du das Problem an Hand meiner etwas unglücklichen Beschreibung nicht?

MfG
 
Zurück