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:

<nap>
  <tanora />
  <tanora />
  <tanora />
</nap>
<nap>
  <tanora />
  ...
</nap>
  ...
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

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="Orarend.xslt"?>

<orarend>
  <nap>
    <tanora>h1</tanora>
    <tanora>h2</tanora>
    <tanora>h3</tanora>
  </nap>
  <nap>
    <tanora>k1</tanora>
    <tanora>k2</tanora>
    <tanora>k3</tanora>
    <tanora>k4</tanora>
  </nap>
  <nap>
    <tanora>sz1</tanora>
    <tanora>sz2</tanora>
  </nap>
</orarend>
Az XSLT fájl

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

  <xsl:template match="/orarend">
    <xsl:variable name="orakegynapon">
      <xsl:apply-templates select="nap[1]" mode="orakmaximukeres"/>
    </xsl:variable>

    <table>
      <tr>
        <td>Orarend</td>
        <xsl:for-each select="nap">
          <td><xsl:value-of select="position()"/>. nap</td>
        </xsl:for-each>
      </tr>
      <xsl:call-template name="sor">
        <xsl:with-param name="hanyadikora" select="1"/>
        <xsl:with-param name="hatralevoorak" select="$orakegynapon"/>
      </xsl:call-template>
    </table>
  </xsl:template>


  <xsl:template match="nap" mode="orakmaximukeres">
    <xsl:param name="eddigimaximum" select="0"/>

    <xsl:variable name="aktualisorakszama" select="count(tanora)"/>
    <xsl:variable name="aktualismaximum">
      <xsl:choose>
        <xsl:when test="$aktualisorakszama &gt; $eddigimaximum">
          <xsl:value-of select="$aktualisorakszama"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="$eddigimaximum"/>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:variable>

    <xsl:choose>
      <xsl:when test="following-sibling::nap">
        <xsl:apply-templates select="(following-sibling::nap)[1]" mode="orakmaximukeres">
          <xsl:with-param name="eddigimaximum" select="$aktualismaximum"/>
        </xsl:apply-templates>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$aktualismaximum"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template name="sor">
    <xsl:param name="hanyadikora"/>
    <xsl:param name="hatralevoorak"/>
    <xsl:if test="$hatralevoorak &gt; 0">
      <tr>
        <td>
          <xsl:value-of select="$hanyadikora"/>. ora
        </td>
        <xsl:for-each select="nap">
          <td>
            <xsl:apply-templates select="tanora[$hanyadikora]"/>
          </td>
        </xsl:for-each>
      </tr>
      <xsl:call-template name="sor">
        <xsl:with-param name="hanyadikora" select="($hanyadikora)+1"/>
        <xsl:with-param name="hatralevoorak" select="($hatralevoorak)-1"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>
</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.