[XSL] dubbele spaties vervangen

Pagina: 1
Acties:

  • blimmel
  • Registratie: Augustus 1999
  • Niet online

blimmel

Matched: TeamBVD

Topicstarter
Ik heb een XML newsfeed waar regelmatig tabellen instaan die zijn opgebouwd uit spaties. Als ik daar met een XSL sheet HTML van maak blijft van de opmaak in de browser natuurlijk niets over.
Natuurlijk heb ik het eerst in een <pre> gezet. De tabellen zien er dan goed uit, maar de overige tekst komt op 1 regel en verknoeit de layout. Ik heb geprobeerd of ik dit met een CSS op kon lossen, maar dat was ook zonder succes. <pre> trekt zich niets aan van width en <pre wrap> doet ook niet veel.

Wat wel werkt (in mijn teksteditor met search/replace) is om alle newlines vervangen door <br>, alle dubbele spaties vervangen door &nbsp;&nbsp; en dan een monospaced font gebruiken.
Nu lukt het mij niet om een spatie te vervangen, ook niet als &#32;

Ik gebruik in mij XSL het volgende welbekende template:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<xsl:template name="replace-string">
    <xsl:param name="text"/>
    <xsl:param name="from"/>
    <xsl:param name="to"/>

    <xsl:choose>
      <xsl:when test="contains($text, $from)">

    <xsl:variable name="before" select="substring-before($text, $from)"/>
    <xsl:variable name="after" select="substring-after($text, $from)"/>
    <xsl:variable name="prefix" select="concat($before, $to)"/>
    <xsl:value-of select="$before"/>
    <xsl:value-of select="$to"/>
    <xsl:call-template name="replace-string">
      <xsl:with-param name="text" select="$after"/>
      <xsl:with-param name="from" select="$from"/>
      <xsl:with-param name="to" select="$to"/>
    </xsl:call-template>      
      </xsl:when> 
      <xsl:otherwise>
        <xsl:value-of select="$text"/>  
      </xsl:otherwise>
    </xsl:choose>            
</xsl:template>

wat ik dan aanroep met:
code:
1
2
3
4
5
6
    <xsl:call-template name="replace-string">
        <xsl:with-param name="text" 
             select="/STORY/CONTENT"/>
        <xsl:with-param name="from"> </xsl:with-param>
        <xsl:with-param name="to">&nbsp;</xsl:with-param>
    </xsl:call-template>


edit: Nog even een voorbeeld van het probleem (daar gaat de opmaak)

code:
1
2
3
4
5
6
7
8
9
naam            getal  getal  getal
tekst1            212    442   3212
tekst2              2      2     12
tekstje3         3212     42    212
tekstje4           22    442     12
nog een tekst5      2      4    212
laatste tekst     212   442    212

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Phasellus nec sem. Aenean consectetuer sem ut mi. Maecenas blandit tellus convallis sapien.


kan iemand mij de juiste kant uitsturen?

[ Voor 69% gewijzigd door blimmel op 07-01-2004 16:24 . Reden: voorbeeld erbij ]

Join TeamBVD!


Verwijderd

Doet de 'normalize-space' functie niks? Anders translate() misschien.

http://www.w3schools.com/xsl/xsl_functions.asp

  • blimmel
  • Registratie: Augustus 1999
  • Niet online

blimmel

Matched: TeamBVD

Topicstarter
normalize-space haalt de spaties weg, maar ik wil ze vervangen door nonbreakable spaces om de opmaak enigzins te redden (met alleen het verschil met even of oneven aantal spaties).

Misschien zou anders met een javascript aan de clientside kunnen....
maar xsl heeft mijn voorkeur.

Join TeamBVD!


  • blimmel
  • Registratie: Augustus 1999
  • Niet online

blimmel

Matched: TeamBVD

Topicstarter
(deze reactie hoort eigenlijk in W&G thuis, maar ik zet het voor de volledigheid erbij)

Het vervangen van de newlines door <br>'s lukte wel, maar niet het vervangen van 2 spaties door 2 &nbsp;'s.

Uiteindelijk heb ik het opgelost met een javascript (fixit()), bij gebrek aan een elegantere oplossing. Deze wordt aangeroepen door een onload.

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
    function fixcode(input) { 
    input = input.replace(/  /g, '&nbsp;&nbsp;'); 
    input = input.replace(/\n/g, '<br />');
    input = input.replace(/<PRE>/g, ' '); 
    input = input.replace(/<\/PRE>/g, ' '); 
    input = input.replace(/&lt;p&gt;/g, '<p>'); 
    input = input.replace(/&lt;\/p&gt;/g, '<\/p>');
    return input; 
    } 

    function fixit() { 
    document.getElementsByTagName('body')[0].innerHTML = fixcode(document.getElementsByTagName('body')[0].innerHTML); 
    } 

Ik kon de tekst alleen goed uitlezen met document.getElementsByTagName('body')[0].innerHTML door de tekst in een <pre> te stoppen en deze daarna weer te verwijderen. Spaties en newlines zijn blijkbaar alleen in een <pre> uit te lezen.
Op een of ander manier veranderden de <p>'s in &lt;p&gt;, die moest ik er ook weer uithalen....

Het is niet echt netjes, maar het werkt :)

[ Voor 17% gewijzigd door blimmel op 07-01-2004 22:00 ]

Join TeamBVD!