[php/xml] linebreaks in xsl weergeven

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • scarhand
  • Registratie: December 2001
  • Laatst online: 24-06-2021
Ik zit met een probleem. Ik heb een nieuwsscriptje geschreven en dat werkt perfect, de data wordt perfect uitgelezen uit de database, en als ik deze gewoon echo ook goed weergegeven.
Nou stuur ik de data uit de database naar een xml document dat later opgemaakt wordt door een xsl stylesheet. Alleen het probleem is dat mijn linebreaks niet weergegeven worden.
Dit komt (waarschijnlijk) omdat xsl de <br /> tags als een losse tag ziet. Heeft iemand een idee hoe ik deze linebreaks toch kan weergeven in xml/xsl?

Ik heb het geprobeerd met de <pre></pre> tag, maar deze breekt lange regels niet af, zodat het in een tabelletje past.

http://lists.w3.org/Archi...-xsl-fo/2001Nov/0001.html
De <block> </block> <block/> methode die hier staat werkte helaas ook niet.

[ Voor 4% gewijzigd door scarhand op 28-01-2003 13:56 . Reden: typo ]


Acties:
  • 0 Henk 'm!

  • tech-no-logical
  • Registratie: December 2000
  • Laatst online: 17-09 22:52
misschien mis ik iets, maar dit :
code:
1
2
3
<xsl:for-each select="//nieuwsitem">
  <xsl:value-of select="headline" /><br />
</xsl:for-each>

zou gewoon linebreaks moeten laten zien (bij mij iig wel)

Acties:
  • 0 Henk 'm!

  • scarhand
  • Registratie: December 2001
  • Laatst online: 24-06-2021
tech-no-logical schreef op 28 January 2003 @ 14:13:
misschien mis ik iets, maar dit :
code:
1
2
3
<xsl:for-each select="//nieuwsitem">
  <xsl:value-of select="headline" /><br />
</xsl:for-each>

zou gewoon linebreaks moeten laten zien (bij mij iig wel)
Klopt, dat werkt ook wel, ook bij mij. Maar de linebreaks zitten in de "headline" zeg maar...

Acties:
  • 0 Henk 'm!

  • tech-no-logical
  • Registratie: December 2000
  • Laatst online: 17-09 22:52
scarhand schreef op 28 January 2003 @ 14:14:
[...]
Klopt, dat werkt ook wel, ook bij mij. Maar de linebreaks zitten in de "headline" zeg maar...
ah, okee, nou snap ik 't. ik heb ook zoiets, maar ik heb dat vrij 'dirty' opgelost. voordat een headline een text-node in gaat, vervang ik alle '<' en '>' door '<' en '>' om te voorkomen dat ik extra nodes krijg (zo blijft alles 1 text-node).
als 't terugkomt doe ik (_na_ de xslt-process stap, dus 't is al html) deze stap weer andersom. er moet een betere manier zijn om html-code op te slaan in text-nodes, maar dit werkt voor mij.

Acties:
  • 0 Henk 'm!

  • scarhand
  • Registratie: December 2001
  • Laatst online: 24-06-2021
ok, ik dank u zeer, het werkt inmiddels. Het is inderdaad niet de meest mooie oplossing maar toch...

Ik doe het nu zo:
in php (voordat ik het naar xml stuur):

PHP:
1
2
3
<?
$topicinfo[$i][parsed_text] = str_replace("<br />","&lt;br /&gt;",$topicinfo[$i][parsed_text]);
?>


daarna in xsl:
<xsl:value-of select="parsedtext" disable-output-escaping="yes"/>

Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
Yakkes, yakkes, yakkes. Als je even wat verder in XSL duikt kan je hiervoor toch wel een goede oplossing verzinnen?

Als ik je goed begrijp wil je gewoon een br in de input doorgeven aan de output. Wat dacht je dan van dit?
code:
1
2
3
<xsl:template match="br">
   <br/>
</xsl:template>


Voor gein hier een generieke transformatie die alles simpelweg doorgeeft aan de input. Dit is dus een identity template. Je kan hier eventueel specifieke gevallen aan toevoegen en zo een XHTML document met wat andere content transformeren.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0"?>

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
               version="1.0">
 
    <xsl:output method="xml"/>

    <xsl:template match="*">
        <xsl:element name="{name(.)}">
            <xsl:for-each select="@*">
                <xsl:attribute name="{name(.)}">
                    <xsl:value-of select="."/>
                </xsl:attribute>
            </xsl:for-each>
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>

</xsl:transform>

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Acties:
  • 0 Henk 'm!

  • tech-no-logical
  • Registratie: December 2000
  • Laatst online: 17-09 22:52
scarhand schreef op 28 January 2003 @ 14:25:
daarna in xsl:
<xsl:value-of select="parsedtext" disable-output-escaping="yes"/>
kijk daar mee uit. als je headlines speciale karakters bevatten kun je _daar_ weer problemen mee krijgen (disable-output-escaping werkt voor alle characters, niet alleen > en <). dat was voor mij de reden om alleen die twee characters speciaal te behandelen.
als je sablotron errors krijgt als deze :

Warning: Sablotron error on line 4: character 'é' is illegal in the output encoding

dan weet je waar 't aan ligt.

Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
Overigens kan je dan dus ook geen value-of doen. Als een element mogelijk substructuur heeft, moet je, zeker in het geval van mixed-content, vrijwel altijd templates gebruiken. Dit zorgt er dan ook voor dat de br template wordt gebruikt. De tekst wordt doorgegeven met het default template voor text().

code:
1
2
3
<xsl:for-each select="//nieuwsitem">
  <xsl:value-of select="headline" /><br />
</xsl:for-each>


Moet dus worden:

code:
1
2
3
<xsl:for-each select="//nieuwsitem">
  <xsl:apply-templates select="headline" />
</xsl:for-each>


en eigenlijk nog liever:
code:
1
2
3
4
5
6
7
8
9
10
11
<xsl:template match="/">
   <xsl:apply-templates select=""//nieuwsitem"/>
</xsl:template>
 
<xsl:template match="nieuwsitem">
  <xsl:apply-templates select="headline"/>
</xsl:template>
 
<xsl:template match="headline">
   <xsl:apply-templates/>
</xsl:template>

De laatste kan je in principe weglaten, want dit is ook weer een default template.

[ Voor 14% gewijzigd door mbravenboer op 28-01-2003 14:40 ]

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Acties:
  • 0 Henk 'm!

  • tech-no-logical
  • Registratie: December 2000
  • Laatst online: 17-09 22:52
mbravenboer schreef op 28 January 2003 @ 14:39:
Overigens kan je dan dus ook geen value-of doen. Als een element mogelijk substructuur heeft, moet je, zeker in het geval van mixed-content, vrijwel altijd templates gebruiken. Dit zorgt er dan ook voor dat de br template wordt gebruikt. De tekst wordt doorgegeven met het default template voor text().
jouw oplossing is heel netjes. soortgelijke oplossingen (maar dan met <xsl:copy-of> om de hele substructuur mee te nemen) had ik ook bedacht.

echter, in mijn geval zijn deze oplossingen hoogst onwenselijk. die (door html gegenereerde) tree-fragments geeft me veel ellende bij het intern in de app werken met de dom-tree. intern is het haast noodzakelijk om die content in 1 text-node te hebben, anders is er niet mee te werken (of wordt dat in elk geval een stuk ingewikkelder). vandaar de (wat vieze) oplossing met de replace.

als ik 't netter wil doen (ben ik ook wel van plan) wil ik alleen die replace niet meer globaal doen, maar voor specifieke text-nodes (waar dus eventueel html-code in kan zitten).
Pagina: 1