Avatar billede gedebuk Nybegynder
03. december 2003 - 13:04 Der er 6 kommentarer og
1 løsning

XSL i flere kolonner [igen]

Hejsa.

Jeg har fået løst mit problem i spg. http://www.eksperten.dk/spm/434605.

Nu vil jeg gerne en anden ting også.
Hvis vi tager samme eksempel som i mit tidligere spørgsmål, vil jeg gerne have en tabel, hvis rækker er elementerne i <emne>. Der skal altså være lige så mange kolonner, som der er <emne>-elementer:

  Tal1  11  21
  Tal2  12  22
  Talx  1x  2x


XML-filen:

<emner>
  <emne>
    <tal1>11</tal1>
    <tal2>12</tal2>
  </emne>
  <emne>
    <tal1>21</tal1>
    <tal2>22</tal2>
  </emne>
</emner>

Kan det sådan lige lade sig gøre?

Mvh. og på forhånd tak,
Mads
Avatar billede trolle Nybegynder
03. december 2003 - 14:44 #1
hmm den blev en smule langhaaret, men jeg skulle mene at foelgende skulle goere det...

<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="emner">
<xsl:apply-templates>
</xsl:template>

<!-- select first -->
<xsl:template match="emne[1]">
  <xsl:for-each select="child::text()">
    <tr>
      <td> Tal<xsl:number/> </td>
      <td> <xsl:value-of select="."/> </td>
      <xsl:variable name="number" select=".">
      <!-- for alle andre emners boern med med samme navn -->
      <xsl:for-each
    select="../following-sibling::emne/child::*[. = $number]">
    <td> <xsl:value-of select="."/> </td>
      </xsl:for-each>
    </tr>
  </xsl:for-each>
</xsl:template>

<xsl:template match="emne"/>
Avatar billede trolle Nybegynder
03. december 2003 - 21:10 #2
efter en laengere rensagning kom jeg frem til at ovenstaaende ikke virker... men jeg kigge lidt ind i det (tests) og kom frem til foelgende der virker:


<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" indent="yes"/>

  <xsl:template match="/"> 
    <html>
      <head/>
      <body>
    The beginning
    <xsl:apply-templates/>
    The end
      </body>
    </html>
  </xsl:template>

  <xsl:template match="emner">
    <table>
      <xsl:apply-templates/>
    </table>
  </xsl:template>

  <!-- select first -->
  <xsl:template match="emne[1]">
    <xsl:for-each select="*">
      <tr>
    <td> <xsl:value-of select="local-name()"/> </td>
    <td> <xsl:value-of select="."/> </td>
    <xsl:variable name="number" select="local-name()"/>
    <!-- for alle andre emners boern med med samme navn -->
    <xsl:for-each select="../following-sibling::emne/child::*[local-name()=$number]">
      <td> <xsl:value-of select="."/> </td>
    </xsl:for-each>
      </tr>
    </xsl:for-each>
  </xsl:template>

  <xsl:template match="emne"/>
  <xsl:template match="*"/>
</xsl:stylesheet>
Avatar billede gedebuk Nybegynder
03. december 2003 - 23:32 #3
Weee, det virker perfekt :-)
Respekt for det!

Jeg ville dog gerne kunne ændre teksten i første kolonne, så det ikke er navnet på XML-elementet, der bliver udskrevet.
Kan det fikses?

/ Mads
Avatar billede trolle Nybegynder
03. december 2003 - 23:41 #4
Det burde vare simpelt nok at aendre:

<!-- select first -->
  <xsl:template match="emne[1]">
    <xsl:for-each select="*">
      <tr>
    <!-- her kommer foerste kolonne: -->
    <td>  du kan skrive hvad du vil!!! </td>

    <td> <xsl:value-of select="."/> </td>
    <xsl:variable name="number" select="local-name()"/>
    <!-- for alle andre emners boern med med samme navn -->
    <xsl:for-each select="../following-sibling::emne/child::*[local-name()=$number]">
      <td> <xsl:value-of select="."/> </td>
    </xsl:for-each>
      </tr>
    </xsl:for-each>
  </xsl:template>
Avatar billede gedebuk Nybegynder
03. december 2003 - 23:45 #5
Jep, det er fint nok, men jeg vil gerne have forskellig tekst, alt efter om det er <tal1> eller <tal2>.

/ Mads
Avatar billede trolle Nybegynder
03. december 2003 - 23:49 #6
hmm du kan lave en kontruktion som:

<td>
  <xsl:choose>
    <xsl:when test="local-name()=tal1"> foerste </xsl:when>
    <xsl:when test="local-name()=tal2"> anden </xsl:when>
    <xsl:when test="local-name()=tal3"> tredje </xsl:when>
    <xsl:otherwise> alt andet </xsl:otherwise>
  </xsl:choose>
</td>

Den er dog ikke saerlig paen, da den ikke bandler tal over 3 saerligt godt...
Avatar billede gedebuk Nybegynder
03. december 2003 - 23:54 #7
Så var den der. Super arbejde!

Jeg siger MANGE tak for hjælpen :o)

/ Mads
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester