HTML uitvoer via XSL

Pagina: 1
Acties:

  • gfgw
  • Registratie: Oktober 2003
  • Laatst online: 22-10 10:53
Ik wil het volgende doen:
- voor elk item in de XML een cel in een tabel, met daarin de gegevens
- na elke 3 items een nieuwe rij in de tabel

Ik heb het volgende geprobeerd:
XML:
1
2
3
4
5
6
7
8
9
10
11
<table>
    <tr>
        <xsl:for-each select="image">
            <xsl:if test="position() mod 4 = 0">
                </tr><tr>
            </xsl:if>
            <td><xsl:apply-templates select="."/></td>

        </xsl:for-each>
    </tr>
</table>


De parser geeft echter een foutmelding, dat op de plek van </tr><tr> een </xsl:if> verwacht wordt.
De regel </tr><tr> vervangen door </tr><tr> leidt er toe dat in de gegenereerde HTML pagina de tekst </tr><tr> verschijnt, in plaats van een nieuwe rij in de tabel. Ook xsl:value-of en xsl:text leiden niet tot het gewenste resultaat.

Hoe moet ik de nieuwe rij in de tabel laten maken?

[ Voor 0% gewijzigd door een moderator op 09-01-2007 14:29 . Reden: ff je codetag aangepast zodat het wat leesbaarder wordt :P ]


  • soepkip
  • Registratie: Augustus 2000
  • Laatst online: 26-11 16:55

soepkip

Kratjes kunnen nu ook voorin

De Parser kijkt niet zozeer naar de logica van je statements , kijkt wel of de output van het statment op zichzelf valide is dus
code:
1
       </tr><tr>

is op zichzelf niet valide

Beste film ooit


  • Blue-eagle
  • Registratie: September 2000
  • Niet online
Ik weet niet of je tabellen moet gebruiken, je zou divjes kunnen overwegen die gewoon naast elkaar staan (floaten) in een comtainer met een bepaalde breedte. Als het toch tabulaire data is moet je volgens mij..

XML:
1
2
3
4
5
6
7
8
9
10
<xsl:for-each select="image">
    <xsl:if test="position() mod 4 = 0">
    <tr>
        <td><xsl:value-of select="." /></td>
        <td><xsl:value-of select="following-sibling::image[2]/." /></td>
        <td><xsl:value-of select="following-sibling::image[3]/." /></td>
        <td><xsl:value-of select="following-sibling::image[4]/." /></td>
    <tr>
    </xsl:if>
</xsl:for-each>


Doen.. uit het blote hoofd, kan er volledig naast zitten ;)

  • gfgw
  • Registratie: Oktober 2003
  • Laatst online: 22-10 10:53
soepkip schreef op dinsdag 09 januari 2007 @ 14:12:
De Parser kijkt niet zozeer naar de logica van je statements , kijkt wel of de output van het statment op zichzelf valide is dus
code:
1
       </tr><tr>

is op zichzelf niet valide
Ja, dat is wel valide (want eerder staat er al een <tr> en aan het einde een </tr>).
Het probleem zit hem in het feit dat ik een <tr> heb, daarna een <xsl:if>, daarna een </tr> en tenslotte een </xsl:if>. De </tr> wordt geparsed als onderdeel van de XSL, en die ziet een sluittag binnen de if, waarbij de opentag niet binnen de if staat. (Misschien bedoelde je met je opmerking hetzelfde, maar dan heb ik het verkeerd begrepen.)

De vraag is dan iets nauwkeuriger gesteld: hoe kan ik </tr><tr> in de uitvoer krijgen, zonder dat dit geparsed wordt als onderdeel van de XSL? < in plaats van < gaat net een stap te ver: de HTML parser die XSL uitvoer verwerkt, krijgt geen < te zien.

  • soepkip
  • Registratie: Augustus 2000
  • Laatst online: 26-11 16:55

soepkip

Kratjes kunnen nu ook voorin

Met andere woorden probeerde ik ongeveer hetzelfde te brabelen 8)7

In ieder geval dat de XSL processor de statements an sich verifieerd, zonder context

[ Voor 19% gewijzigd door soepkip op 09-01-2007 14:57 ]

Beste film ooit


Verwijderd

gfgw schreef op dinsdag 09 januari 2007 @ 14:34:
De vraag is dan iets nauwkeuriger gesteld: hoe kan ik </tr><tr> in de uitvoer krijgen, zonder dat dit geparsed wordt als onderdeel van de XSL? < in plaats van < gaat net een stap te ver: de HTML parser die XSL uitvoer verwerkt, krijgt geen < te zien.
Misschien werkt dit?

XML:
1
<[CDATA[</tr><tr>]]>

Verwijderd

gebruik geen haken voor dat soort tags, maar

< ipv <
en
> ipv >

edit, got parsed dat dus als haak hihi, hier met spaties ertussen:

& l t ; ipv <


& g t ; ipv >

zonder spaties dan dus :P

edit, ah ik zie het nu ja, solly voor de non oplossing!

[ Voor 59% gewijzigd door Verwijderd op 09-01-2007 19:33 ]


  • Patriot
  • Registratie: December 2004
  • Nu online

Patriot

Fulltime #whatpulsert

Ik denk dat de TS dat ook al geprobeerd heb, ik zie namelijk meerdere malen dat hij </tr><tr> doet ipv </tr><tr>, waarbij ik er van uit ga dat hij bij de eerste </tr><tr> de ASCII codes gebruikt.

  • gfgw
  • Registratie: Oktober 2003
  • Laatst online: 22-10 10:53
Ik heb het anders opgelost:

Aantal kolommen:
XML:
1
<xsl:variable name="columncount" select="3" />


Loop langs alle elementen:
XML:
1
2
3
4
5
6
7
<xsl:for-each select="image">
    <xsl:if test="(position() - 1) mod $columncount = 0">
        <tr>
            <xsl:call-template name="columns" />
        </tr>
    </xsl:if>
</xsl:for-each>


Recursief template:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<xsl:template name="columns">
    <xsl:param name="count" select="0"/>

    <xsl:if test="$count &lt; $columncount">
        <td>
            <xsl:choose>
                <xsl:when test="$count = 0">
                    <xsl:apply-templates select="."/>
                </xsl:when>
                <xsl:otherwise>
                    <xsl:apply-templates select="following-sibling::*[$count]"/>
                </xsl:otherwise>
            </xsl:choose>
        </td>
        <xsl:call-template name="columns">
            <xsl:with-param name="count" select="$count + 1"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>


Dit gaat alleen niet goed voor een kolomaantal van 1 en 2, maar die ga ik waarschijnlijk toch niet gebruiken.

Alle posters bedankt voor de input.

Verwijderd

Ehh, misschien wat (te) laat maar zou zoiets niet werken?

XML:
1
2
3
4
5
6
7
8
9
10
11
12
<table> 
   <xsl:for-each select="image"> 
      <xsl:if test="position() mod 4 = 0"> 
        <tr></tr> 
      </xsl:if> 
      <tr>
        <td>
        <xsl:apply-templates select="."/>
        </td> 
      </tr>
   </xsl:for-each> 
</table>
Pagina: 1