[XSL] string vervangen door string met HTML tags

Pagina: 1
Acties:

  • Barracuda_82
  • Registratie: September 2001
  • Laatst online: 19-12-2024

Barracuda_82

mkTime(), not war!

Topicstarter
Ik heb een stukje code (gevonden) dat er voor zorgt dat een string vervangen wordt door een andere string. Dat werkt goed, alleen nu wil ik dat de string vervangen wordt door een string die HTML bevat en daar kom ik niet uit.

De XSL moet dus alle '2' vervangen worden door '<b>2</b>' maar als ik HTML code gebruik in de XSL dan flipt de pagina (krijg een witte pagina, dus ook geen error). Hoe kan ik HTML gebruiken in deze functie?

Hier roep ik de replace template aan:
code:
1
2
3
4
5
6
7
8
9
<xsl:variable name="myString" select="@naam"/>
    <xsl:variable name="myNewString">
        <xsl:call-template name="replaceCharsInString">
            <xsl:with-param name="stringIn" select="string($myString)"/>
            <xsl:with-param name="charsIn" select="'2'"/>
             <xsl:with-param name="charsOut" select="'<b>2</b>'"/>
        </xsl:call-template>
    </xsl:variable>
<xsl:value-of select="$myNewString" />


En dit is de replace template:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- here is the template that does the replacement -->
  <xsl:template name="replaceCharsInString">
    <xsl:param name="stringIn"/>
    <xsl:param name="charsIn"/>
    <xsl:param name="charsOut"/>
    <xsl:choose>
      <xsl:when test="contains($stringIn,$charsIn)">
        <xsl:value-of select="concat(substring-before($stringIn,$charsIn),$charsOut)"/>
        <xsl:call-template name="replaceCharsInString">
          <xsl:with-param name="stringIn" select="substring-after($stringIn,$charsIn)"/>
          <xsl:with-param name="charsIn" select="$charsIn"/>
          <xsl:with-param name="charsOut" select="$charsOut"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$stringIn"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  • Victor
  • Registratie: November 2003
  • Niet online
Vervang de "<" en ">" in "<b>2</b>" eens door respectievelijk:
code:
1
&lt;
en
code:
1
&gt;


Overigens ben ik zeer benieuwd waarom je dit met string replacement wil oplossen, en niet gewoon
XML:
1
<b><xsl:value-of select="xPath"/></b>
o.i.d. gebruikt.

  • Barracuda_82
  • Registratie: September 2001
  • Laatst online: 19-12-2024

Barracuda_82

mkTime(), not war!

Topicstarter
King_Louie schreef op maandag 15 januari 2007 @ 12:14:
Vervang de "<" en ">" in "<b>2</b>" eens door respectievelijk:
code:
1
&lt;
en
code:
1
&gt;


Overigens ben ik zeer benieuwd waarom je dit met string replacement wil oplossen, en niet gewoon
XML:
1
<b><xsl:value-of select="xPath"/></b>
o.i.d. gebruikt.
Ik heb
code:
1
&lt;
en
code:
1
&gt;
al een keer geprobeerd, maar dan krijg ik letterlijk de HTML in mijn output, de bedoeling is dus dat de cijfers bold worden.

Om e.e.a. te verduidelijken: ik heb een menu waarin elke titel een 2 bevat. Die cijfers zijn in het ontwerp allemaal roze (de rest van de tekst is wit). Mijn idee was dus om in de XML alle cijfers een style te geven en zo alles roze te maken.

  • Victor
  • Registratie: November 2003
  • Niet online
Barracuda_82 schreef op maandag 15 januari 2007 @ 12:17:
Om e.e.a. te verduidelijken: ik heb een menu waarin elke titel een 2 bevat. Die cijfers zijn in het ontwerp allemaal roze (de rest van de tekst is wit). Mijn idee was dus om in de XML alle cijfers een style te geven en zo alles roze te maken.
Aha, dat verklaar het een en ander :)

Ik heb geen ervaring verder met string replacement in XSLT, dus daar kan ik je zo snel niet mee helpen. Het feit dat je parser geen fout terug geeft, suggereert dat het wel werkt, maar niet zoals verwacht. Kun je niet een simpele testcase bouwen met een XML file met één woord erin dat je vervangt door wat anders, puur om te checken of je string replacement wel werkt?

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Ik denk dat ik het gewenste effect heb bereikt, zie hier.

De truc is om niet te denken in termen van strings, maar in termen van trees. Wat jij wilde had ik ook min of meer werkend, maar in XSLT is het altijd lastig om van strings weer elementen te maken (wat jij probeerde te doen). Mijn oplossing is dus om dat helemaal niet te doen, maar er een wat specifiekere style-template van te maken, die een stukje tekst in een grotere lap tekst een stijl geeft.

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="style">

        <xsl:param name="haystack" />
        <xsl:param name="needle" />
        <xsl:param name="style" />
        
        <xsl:choose>
            <xsl:when test="contains($haystack, $needle)">
                <xsl:value-of select="substring-before($haystack, $needle)" />
                <span class="{$style}">
                    <xsl:value-of select="$needle" />
                </span>
                <xsl:call-template name="style">
                    <xsl:with-param name="haystack" select="substring-after($haystack, $needle)" />
                    <xsl:with-param name="needle" select="$needle" />
                    <xsl:with-param name="style" select="$style" />
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="$haystack" />
            </xsl:otherwise>
        </xsl:choose>

    </xsl:template>
Ik raad je trouwens aan in het vervolg veel grondiger je indentatie in de gaten te houden, dat was nogal een rotzooitje. En check ook even wat ik heb gedaan met je class-attributes op de li/a-elementen, je hebt zo VEEL minder code nodig, wat een en ander ook weer veel leesbaarder maakt.

Rustacean


  • Barracuda_82
  • Registratie: September 2001
  • Laatst online: 19-12-2024

Barracuda_82

mkTime(), not war!

Topicstarter
Dat is de oplossing! Het werkt!

Duizend maal dank!

Ik heb het wel een beetje nog aangepast op mijn xsl-onkunde, maar het werkt goed.
De reden dat mijn indents niet zo mooi zijn is dat ik nogal met een vervelende korte deadline zit.
Pagina: 1