2009-12-17 7 views
1

J'ai un fichier XML:XSLT: inverser la chaîne par une virgule

<schools> 
    <schcool> 
     school1, school2, school3, school4, school5 
     </schcool> 
    </schools> 

Je veux écrire XSLT (version 1.0) pour changer le résultat d'un ordre inverse comme ceci:

<schools> 
    <schcool> 
     school5, school4, school3, school2, school1 
     </schcool> 
    </schools> 

Quelqu'un peut-il m'aider? Merci beaucoup.

DY

+1

Après avoir édité les deux extraits XML, l'apparence est la même. Est-ce intentionnel? –

+0

Hehe, vient de le changer. Merci. –

+1

@DotNet Utilisateur, pas encore accepté de réponse? Jut pour rappeler. – sangam

Répondre

4
<template name="split" xmlns="http://www.w3.org/1999/XSL/Transform"> 
    <param name="s" /> 
    <param name="withcomma" select="false()" /> 
    <choose> 
    <when test="contains($s, ',')"> 
     <!-- if there is still a comma, call me again 
      with everything after the first comma... --> 
     <call-template name="split"> 
     <with-param name="s" select="substring-after($s, ',')" /> 
     <with-param name="withcomma" select="true()" /> 
     </call-template> 
     <!-- ...and print afterwards the current part --> 
     <value-of select="substring-before($s, ',')" /> 
     <if test="$withcomma"> 
     <text>, </text> 
     </if> 
    </when> 
    <otherwise> 
     <!-- No comma left in the remaining part: print the rest --> 
     <value-of select="$s" /> 
     <if test="$withcomma"> 
     <text>, </text> 
     </if> 
    </otherwise> 
    </choose> 
</template> 

Vous pourriez avoir à bricoler un peu avec les espaces blancs (regardez la fonction XPath « normalize-space() ») pour obtenir le résultat exact, mais l'inverse de tri en principe est illustré dans le code ci-dessus . Appelez-de vos autres modèles comme celui-ci:

<call-template name="split"> 
    <with-param name="s" select="." /> 
    </call-template> 
+0

Merci beaucoup. –

+0

De nada. En fait, les appels récursifs aux modèles sont assez fréquents dans XSLT. Vous devriez vous habituer à cette technique. – Boldewyn

+0

Attention, votre fonction ne retournera rien s'il n'y a pas de virgules dans le texte ... – Erlock

1

Une variante sans xsl: choose:

<xsl:template name="reverse"> 
    <xsl:param name="text"/> 
    <xsl:param name="comma" select="false()"/> 
    <xsl:variable name="item" select="substring-before(concat($text, ','), ',')"/>  
    <xsl:if test="normalize-space($item) != ''"> 
     <xsl:call-template name="reverse"> 
     <xsl:with-param name="text" select="substring-after(concat($text, ','), concat($item, ','))"/> 
     <xsl:with-param name="comma" select="true()"/> 
     </xsl:call-template> 
    </xsl:if> 
    <xsl:value-of select="$item"/> 
    <xsl:if test="$comma and $item != ''"> 
     <xsl:text>,</xsl:text> 
    </xsl:if> 
    </xsl:template> 
+0

Salut Erlock, Merci aussi. –

0

Merci. Vous avez économisé mon temps.

éleminez l'espace par ceci:

<xsl:call-template name="split"> 
    <xsl:with-param name="s" select="normalize-space(.)" /> 
</xsl:call-template> 

Un grand merci.

DY

Questions connexes