<XSL> translate()

Pagina: 1
Acties:

  • TuLPMaN
  • Registratie: Februari 2002
  • Laatst online: 00:05
Heeft iemand een idee hoe ik met een XSL stylesheet mbv het commando translate() het karakter '-' kan vertalen naar 'bC.' ?? Als ik het invul zoals hieronder, dan krijg ik alleen de 'b' op mijn scherm vertaald.. ik snap het niet zo goed ?? Iemand idee ?

<xsl:value-of select="translate(@born, '-', 'bC.')"/>

Bladiebla!


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
http://www.zvon.org/xxl/X...t/function_translate.html

lees dat eens goed door, daar staat de verklaring :)

  • TuLPMaN
  • Registratie: Februari 2002
  • Laatst online: 00:05
thanx.... maakt het een stukje duidelijker.. echter, ik snap nog steeds niet hoe ik in mijn geval een oplossing vind. Het gaat erom dat ik een aantal geboortedata van mensen die voor Christus zijn geboren (jajaja... die zijn er ook) laat weergeven met bv. 400 bC. i.p.v. -400. Het gaat dus niet om een enkele string maar een hele groep van strings (@born) die content vormen van een element.

Bladiebla!


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Daar zijn geen standaard xslt functies voor. Wat je kunt doen is het in de bron-xml aan te passen of er d.m.v. scripting zelf een functie voor te maken (heb geen idee hoe).

  • TuLPMaN
  • Registratie: Februari 2002
  • Laatst online: 00:05
marcusk schreef op 02 oktober 2002 @ 22:36:
Daar zijn geen standaard xslt functies voor. Wat je kunt doen is het in de bron-xml aan te passen of er d.m.v. scripting zelf een functie voor te maken (heb geen idee hoe).
Het zou moeten kunnen zonder de bron-xml aan te passen en zonder zelf een scripting te bouwen... de vraag is hoe...

Maar bedankt voor de moiete iig...

Bladiebla!


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Het is een beetje veel code voor zo iets simpels, maar dit werkt:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  <xsl:template name="replace-dash">
    <xsl:param name="string"/>
    <xsl:variable name="before" select="substring-before($string, '-')"/>
    <xsl:variable name="after" select="substring-after($string, '-')"/>
    
    <xsl:choose>
      <xsl:when test="$before">
        <!-- $before is niet leeg dus er zit een '-' in $string -->
        <xsl:value-of select="concat($before, 'bC.', $after)"/>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$string"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

en zo roep je het aan (ipv value-of):
XML:
1
2
3
    <xsl:call-template name="replace-dash">
      <xsl:with-param name="string" select="@born"/>
    </xsl:call-template>

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Als je een XSLT processor gebruikt die EXSLT support kan je daar meer dan genoeg vinden om dit compact op te lossen :) . Ik doel dan met name op de strings module, maar eventueel kan je ook gebruik maken van de reguliere expressies module.

http://ww.exslt.org

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


  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
De replace-functie van exslt werkt ook gewoon met een template (zie str.replace.zip en dan str.replace.function.xsl), maar heeft daar bijna 100 regels voor nodig :)

Bovenstaande code kan gemakkelijk uitgebreid worden naar een generieke replace-functie:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  <xsl:template name="replace">
    <xsl:param name="string"/>
    <xsl:param name="search"/>
    <xsl:param name="replace"/>
    
    <xsl:variable name="before" select="substring-before($string, $search)"/>
    <xsl:variable name="after" select="substring-after($string, $search)"/>
    
    <xsl:choose>
      <xsl:when test="$before">
        <!-- $before is niet leeg dus $search zit in $string -->
        <xsl:value-of select="concat($before, $replace)"/>
        <xsl:call-template name="replace">
          <xsl:with-param name="string" select="$after"/>
          <xsl:with-param name="search" select="$search"/>
          <xsl:with-param name="replace" select="$replace"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$string"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

Met slechts 21 regels code :P (Maar misschien is dat exslt geval efficienter?)

[ Voor 0% gewijzigd door marcusk op 03-10-2002 14:38 . Reden: oeps, beetje scheel getelt ]


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
marcusk: De replace-functie van exslt werkt ook gewoon met een template
Dat moet ik iets relativeren: de template implementatie is slechts een oplossing die in 'noodgevallen' kan worden gebruikt. De functies van EXSLT zouden in een processor die EXSLT support 'ingebouwd' zijn en hoe deze functies geimplementeerd worden is volledig aan de processor.

Een processor die geschreven is in Java, kan dit dus volgens mij gewoon in Java doen. Ik heb alleen geen idee hoe Xalan het op dit implementeert. Naast de template en ingebouwde oplossing is er ook nog de Javascript variant. Het hele idee is vooral dat je de EXSLT functies kan gebruiken onafhankelijk van de processor of het extentie mechanisme van een processor. Met name dat laatste is nogal een flink zootje.

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

Pagina: 1