Announcement

Collapse
No announcement yet.

Problem mit Tabellendarstellung/Sortierung

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

  • Problem mit Tabellendarstellung/Sortierung

    Hallo, habe als ziemlicher XML/XSLT Newbie folgendes Problem, bei dem mir hoffentlich jemand helfen kann.

    Die XML-Datei hat diesen Inhalt:

    HTML Code:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <Bücherliste>
    	<Kategorie name="Fachbücher">
    		<Unterkategorie name="Naturwissenschaften">
    			<Buch name="Das Basiswissen der Chemie" preis="59,90">
    				<Unterteilung name="Kapitel">
    					<kap kapnr="1.0" seitenanzahl="12"/>
    					<kap kapnr="2.1" seitenanzahl="28"/>
    					<kap kapnr="1.1" seitenanzahl="19"/>
    					<kap kapnr="2.0" seitenanzahl="23"/>
    				</Unterteilung>
    			</Buch>
    			<Buch name="Biochemie" preis="49,90">
    				<Unterteilung name="Seiten">
    					<Seiten name="836">
    				</Unterteilung>
    			</Buch>
    			<Buch name="Chemie, 2 Bände"> preis="15,00">
    				<Unterteilung name="Kapitel">
    					<kap kapnr="1.0" seitenanzahl="24"/>
    					<kap kapnr="3.2" seitenanzahl="18"/>
    					<kap kapnr="2.1" seitenanzahl="11"/>
                                            <kap kapnr="2.0" seitenanzahl="20"/>
    			</Buch>
    		</Unterkategorie>
    		<Unterkategorie name="Sozialwissenschaften">
    		...
    		</Unterkategorie>
    	</Kategorie>
    </Bücherliste>
    Die "... " dienen nur der Abkürzung ( XML-Dokument ist well-formed ).

    Viele Bücher der XML-Datei haben keine Kapitel-Angaben, die sollen auch nicht weiter berücksichtigt werden sprich aussortiert- weiterhin sind die einzelnen Kapitel leider nicht sortiert.


    Der Output sollte folgende Form haben:

    Buch_____________________Kapitel______Seitenanzahl

    Das Basiswissen der Chemie______1.0_______12
    _____________________________1.1_______19
    _____________________________2.0_______23
    _____________________________...________...
    Chemie, 2 Bände_______________1.0________24
    _____________________________2.0________20
    _____________________________2.1________11
    _____________________________..._________...


    Mit

    Code:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
          <html>
    	<body>
    	  <table border="1">
    	     <tr>
    		<th align="left">Buch</th>
    		<th align="left">Kapitel</th>
    		<th align="left">Seitenanzahl</th>
    	     </tr>
    		<xsl:for-each select="Bücherliste/Kategorie/Unterkategorie/Buch/Unterteilung[@name='Kapitel']">	
                 <tr>
    		<td>
    		 <xsl:value-of select="../@name"/>
    		</td>
    komme ich an alle Bücher mit Kapitelangaben - so weit, so gut .
    Leider komme ich mit

    <xsl:value-of select="/kap/@kapnr"/>

    nur zum ersten aufgeführten Kapitel - ich benötige aber eine Auflistung aller vorhandenen Kapitel des jeweiligen Buches - des Weiteren wie würde dann die Sortierung mit xsl:sort aussehen, dass alle Kapitel richtig geordnet in der Tabelle stehen.

    Ich hoffe meine Problembeschreibung ist einigermassen verständlich :-) - wäre über jeden Tipp von euch sehr dankbar.
    Vielen Dank im Voraus!

    Karsten

  • #2
    for each ist nur für node-set !!!!!!!

    lieber aufsteigen mit apply-templates

    für jeden Tag dann das template erstellen


    Code:
    
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output indent="yes" method="html"/>
    	<xsl:template match="/">
    		<html>
    			<style type="text/css">
    			table {
        			   border:5pt solid #0000ff;
              		  }
    			td    {
    	      		   border:1pt solid #0000ff;
    		  		  }
    		    </style>
    			<body>
    				<xsl:apply-templates select="Bücherliste"/>
    			</body>
    		</html>
    	</xsl:template>
    	<xsl:template match="Bücherliste">
    		<xsl:apply-templates select="Kategorie"/>
    	</xsl:template>
    	<xsl:template match="Kategorie">
                    <xsl:apply-templates select="Unterkategorie"/>		
    	</xsl:template>
    	<xsl:template match="Unterkategorie">
    		<xsl:if test="count(Buch/Unterteilung[@name='Kapitel']) != 0">
    			<table>
    				<caption>
    					<xsl:value-of select="@name"/>
    				</caption>
    				<tr>
    					<td>Buch</td>
    					<td>Kapitel</td>
    					<td>Seite</td>
    				</tr>
    				<xsl:apply-templates select="Buch"/>
    			</table>
    		</xsl:if>
    	</xsl:template>
    	<xsl:template match="Buch">
    		<xsl:if test="Unterteilung[@name='Kapitel']">
    
    			<tr>
    				<td>
    					<xsl:value-of select="@name"/>
    				</td>
    			</tr>
    			<xsl:apply-templates select="Unterteilung"/>
    		</xsl:if>
    	</xsl:template>
    	<xsl:template match="Unterteilung">
    		<xsl:apply-templates select="kap">
    			<xsl:sort select="translate(@kapnr,'.',',')" data-type="number"/>
    		</xsl:apply-templates>
    	</xsl:template>
    	<xsl:template match="kap">
    		<tr>
    			<td></td>
    			<td>
    				<xsl:value-of select="@kapnr"/>
    			</td>
    			<td>
    				<xsl:value-of select="@seitenanzahl"/>
    			</td>
    		</tr>
    	</xsl:template>
    </xsl:stylesheet>

    Code:
    <html>
      <style type="text/css">
    	table {
              border:5pt solid #0000ff;
              }
    	td    {
    	      border:1pt solid #0000ff;
    		  }
    
    	
      </style>
      <body>2
        <table>
          <caption>Naturwissenschaften</caption>
          <tr>
            <td>Buch</td>
            <td>Kapitel</td>
            <td>Seite</td>
          </tr>
          <tr>
            <td>Das Basiswissen der Chemie</td>
          </tr>
          <tr>
            <td></td>
            <td>1.0</td>
            <td>12</td>
          </tr>
          <tr>
            <td></td>
            <td>1.1</td>
            <td>19</td>
          </tr>
          <tr>
            <td></td>
            <td>2.1</td>
            <td>28</td>
          </tr>
          <tr>
            <td></td>
            <td>2.0</td>
            <td>23</td>
          </tr>
          <tr>
            <td>Chemie, 2 Bände</td>
          </tr>
          <tr>
            <td></td>
            <td>1.0</td>
            <td>24</td>
          </tr>
          <tr>
            <td></td>
            <td>2.1</td>
            <td>11</td>
          </tr>
          <tr>
            <td></td>
            <td>2.0</td>
            <td>20</td>
          </tr>
          <tr>
            <td></td>
            <td>3.2</td>
            <td>18</td>
          </tr>
        </table>
      </body>
    </html>
    und dann mit css einteilen

    Comment


    • #3
      Problem mit Tabellendarstellung/Sortierung

      Hallo xml-looser,
      erstmal vielen dank für deine schnelle und sehr aufschlussreiche Antwort - leider hab ich damit als Laie noch so meine Probleme :-) - das mit den templates für jeden child-knoten verstehe ich.

      Als Lernhilfe benutze ich im Moment das "w3schools.com" XSL Tutorial (mit Tryit Editor) - deshalb benutze ich auch deren JavaScript Ausgabe Code.

      Buch.html
      Code:
      <html>
      <head>
      <script>
      function loadXMLDoc(fname)
      {
        var xmlDoc;
        // code for IE
        if (window.ActiveXObject)
        {
          xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
        }
        // code for Mozilla, Firefox, Opera, etc.
        else if (document.implementation
        && document.implementation.createDocument)
        {
          xmlDoc=document.implementation.createDocument("","",null);
         }
        else
        {
          alert('Your browser cannot handle this script');
        }
      xmlDoc.async=false;
      xmlDoc.load(fname);
      return(xmlDoc);
      }
      
      function displayResult()
      {
      xml=loadXMLDoc("Buchtabelle.xml");
      xsl=loadXMLDoc("Buchtabelle.xsl");
      // code for IE
      if (window.ActiveXObject)
        {
          ex=xml.transformNode(xsl);
          document.getElementById("example").innerHTML=ex;
        }
        // code for Mozilla, Firefox, Opera, etc.
        else if (document.implementation
        && document.implementation.createDocument)
        {
          xsltProcessor=new XSLTProcessor();
          xsltProcessor.importStylesheet(xsl);
          resultDocument = xsltProcessor.transformToFragment(xml,document);
          document.getElementById("example").appendChild(resultDocument);
        }
      }
      </script>
      </head>
      <body id="example" onLoad="displayResult()">
      </body>
      </html>

      Mit meinem alten "falschen" Code der Buchtabelle.xsl funktionierte die Ausgabe über die obige Buch.html einwandfrei - mit deinem XSL-Code erhalte ich keine Ausgabe, was ich nicht wirklich verstehe.

      Weiterhin ist mir die nicht ganz perfekte Sortierung des Ausgabe-Codes aufgefallen - Kapitel 2.1 kommt vor Kapitel 2.0 - sollte aber umgekehrt sein :-)
      Das das erste Kapitel nicht in der gleichen Zeile wie der Buchtitel steht ist mir sogar sehr recht - vielen dank für diese Verbeserung.

      Ich hoffe das meine Unwissenheit nicht zu sehr stresst.
      Und wieder vielen Dank im Voraus für Antworten!

      Karsten

      Comment


      • #4
        meld dich mal bei icq 567877710


        bei mir gehen opera firefox und ie
        bei der sortierung ist wohl bei den parser ein probelm



        <xsl:template match="/">


        <style type="text/css">
        table {
        border:5pt solid #0000ff;
        }
        td {
        border:1pt solid #0000ff;
        padding-left:50px;
        padding-right:50px;
        }
        </style>

        <xsl:apply-templates select="Bücherliste"/>


        </xsl:template>

        html und body entfernen






        <xsl:template match="Unterteilung">
        <xsl:apply-templates select="kap">
        <xsl:sort select="@kapnr" data-type="number"/>
        </xsl:apply-templates>
        </xsl:template>
        die browser kennen nicht translate

        ich teste mit stylus in verbindung mit saxon dort ist alles in ordung
        konnte nicht wissen was mit der xsl gemacht wird
        Zuletzt editiert von xml-looser; 03.09.2009, 17:05.

        Comment

        Working...
        X