ugrás a tartalomhoz

XSLT táblázat-generálás probléma

suidroot · 2006. Szep. 2. (Szo), 15.51
Sziasztok!

Egy HTML-formátumú órarendet szeretnék készíteni, amit egy XSLT-stíluslappal generáltatnék XML-forrásból. A problémám a következő: az XML fájlban a következő struktúrám van: egy adott napot jelölő elemen belül helyezkednek el az adott nap óráit jelölő elemek, valahogy így:
  1. <nap>  
  2.   <tanora />  
  3.   <tanora />  
  4.   <tanora />  
  5. </nap>  
  6. <nap>  
  7.   <tanora />  
  8.   ...  
  9. </nap>  
  10.   ...  
Az órarendet úgy szeretném használni/látni, ahogy azt általában mindenki: hogy egy-egy oszlop egy-egy napot képviseljen, tehát az adott nap tanórái egymás alatt helyezkedjenek el az oszlopban. A HTML táblázat-jelölése viszont ennek ellentmond, mert az alapvetően sor-, és nem oszlop-alapú (<tr>-eken belül a <td>-k). Ebből következik, hogy nem lehet egy <xsl:for-each>-el végigmenni egy-egy napon, és kiíratni az összes tanórát. A kérdésem: hogyan lehetne mégis megoldani, hogy egy-egy nap tanórái egymás alá kerüljenek?
Válaszotokat előre is köszönöm:

Ádám
 
1

A megoldás

Rici · 2006. Szep. 2. (Szo), 20.47
Az XML fájl
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <?xml-stylesheet type="text/xsl" href="Orarend.xslt"?>  
  3.   
  4. <orarend>  
  5.   <nap>  
  6.     <tanora>h1</tanora>  
  7.     <tanora>h2</tanora>  
  8.     <tanora>h3</tanora>  
  9.   </nap>  
  10.   <nap>  
  11.     <tanora>k1</tanora>  
  12.     <tanora>k2</tanora>  
  13.     <tanora>k3</tanora>  
  14.     <tanora>k4</tanora>  
  15.   </nap>  
  16.   <nap>  
  17.     <tanora>sz1</tanora>  
  18.     <tanora>sz2</tanora>  
  19.   </nap>  
  20. </orarend>  
Az XSLT fájl
  1. <?xml version="1.0" encoding="utf-8"?>  
  2.   
  3. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">  
  4.   
  5.   <xsl:template match="/orarend">  
  6.     <xsl:variable name="orakegynapon">  
  7.       <xsl:apply-templates select="nap[1]" mode="orakmaximukeres"/>  
  8.     </xsl:variable>  
  9.   
  10.     <table>  
  11.       <tr>  
  12.         <td>Orarend</td>  
  13.         <xsl:for-each select="nap">  
  14.           <td><xsl:value-of select="position()"/>. nap</td>  
  15.         </xsl:for-each>  
  16.       </tr>  
  17.       <xsl:call-template name="sor">  
  18.         <xsl:with-param name="hanyadikora" select="1"/>  
  19.         <xsl:with-param name="hatralevoorak" select="$orakegynapon"/>  
  20.       </xsl:call-template>  
  21.     </table>  
  22.   </xsl:template>  
  23.   
  24.   
  25.   <xsl:template match="nap" mode="orakmaximukeres">  
  26.     <xsl:param name="eddigimaximum" select="0"/>  
  27.   
  28.     <xsl:variable name="aktualisorakszama" select="count(tanora)"/>  
  29.     <xsl:variable name="aktualismaximum">  
  30.       <xsl:choose>  
  31.         <xsl:when test="$aktualisorakszama &gt; $eddigimaximum">  
  32.           <xsl:value-of select="$aktualisorakszama"/>  
  33.         </xsl:when>  
  34.         <xsl:otherwise>  
  35.           <xsl:value-of select="$eddigimaximum"/>  
  36.         </xsl:otherwise>  
  37.       </xsl:choose>  
  38.     </xsl:variable>  
  39.   
  40.     <xsl:choose>  
  41.       <xsl:when test="following-sibling::nap">  
  42.         <xsl:apply-templates select="(following-sibling::nap)[1]" mode="orakmaximukeres">  
  43.           <xsl:with-param name="eddigimaximum" select="$aktualismaximum"/>  
  44.         </xsl:apply-templates>  
  45.       </xsl:when>  
  46.       <xsl:otherwise>  
  47.         <xsl:value-of select="$aktualismaximum"/>  
  48.       </xsl:otherwise>  
  49.     </xsl:choose>  
  50.   </xsl:template>  
  51.   
  52.   <xsl:template name="sor">  
  53.     <xsl:param name="hanyadikora"/>  
  54.     <xsl:param name="hatralevoorak"/>  
  55.     <xsl:if test="$hatralevoorak &gt; 0">  
  56.       <tr>  
  57.         <td>  
  58.           <xsl:value-of select="$hanyadikora"/>. ora  
  59.         </td>  
  60.         <xsl:for-each select="nap">  
  61.           <td>  
  62.             <xsl:apply-templates select="tanora[$hanyadikora]"/>  
  63.           </td>  
  64.         </xsl:for-each>  
  65.       </tr>  
  66.       <xsl:call-template name="sor">  
  67.         <xsl:with-param name="hanyadikora" select="($hanyadikora)+1"/>  
  68.         <xsl:with-param name="hatralevoorak" select="($hatralevoorak)-1"/>  
  69.       </xsl:call-template>  
  70.     </xsl:if>  
  71.   </xsl:template>  
  72. </xsl:stylesheet>  
Remélem jól érthető, hogy hogyan működik. Ha valami mégsem világos, és érdekel, hogy hogyan működik, akkor kérdezz rá, megpróbálok válaszolni.
2

Kösz!

suidroot · 2006. Szep. 2. (Szo), 23.05
Whooha, köszönöm szépen, bár ezen a kódon még rágódnom kell egy picit - még nem vagyok jártas az XSLT szépségeiben - de valószínűleg nem lesz vele problémám. Kösz mégegyszer.