2009-07-20 10 views
12

Je dois vérifier si une chaîne particulière contient un mot particulier par exemple pour vérifier si, SultansOfSwing contient le mot Swing. Permettez-moi également de mentionner que la valeur de la chaîne en question est inconnue. Comme cela peut être n'importe quel mot, nous ne connaissons pas la longueur et cetera. Je comprends que je peux le faire en utilisant le mot-clé contains.Comment supprimer des caractères particuliers d'une chaîne en utilisant XSLT?

Mais une fois que je sais que ce mot contient le mot-clé Swing, je veux afficher la chaîne sans ce mot "Swing" .. affichant ainsi uniquement "SultansOf".

J'ai essayé d'explorer comment je peux y parvenir sans toutefois passer à travers.

Quelqu'un pourrait-il indiquer quel mot clé ou fonction offrira ce service? Comment puis-je supprimer un mot particulier à l'intérieur d'une chaîne.

Merci pour votre aide à l'avance.

Cordialement.

Dire

Répondre

1

Je pense que cette fonction de remplacement de chaîne est assez exhaustive:

EDIT - nécessaire pour changer $ string à $ string2. Doit fonctionner maintenant

<xsl:template name="string-replace"> 
    <xsl:param name="string1"  select="''" /> 
    <xsl:param name="string2"  select="''" /> 
    <xsl:param name="replacement" select="''" /> 
    <xsl:param name="global"  select="true()" /> 

    <xsl:choose> 
    <xsl:when test="contains($string1, $string2)"> 
     <xsl:value-of select="substring-before($string1, $string2)" /> 
     <xsl:value-of select="$replacement" /> 
     <xsl:variable name="rest" select="substring-after($string1, $string2)" /> 
     <xsl:choose> 
     <xsl:when test="$global"> 
      <xsl:call-template name="string-replace"> 
      <xsl:with-param name="string1"  select="$rest" /> 
      <xsl:with-param name="string2"  select="$string2" /> 
      <xsl:with-param name="replacement" select="$replacement" /> 
      <xsl:with-param name="global"  select="$global" /> 
      </xsl:call-template> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="$rest" /> 
     </xsl:otherwise> 
     </xsl:choose> 
    </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="$string1" /> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

Il est sensible à la casse. Dans votre cas:

<xsl:call-template name="string-replace"> 
    <xsl:with-param name="string1"  select="'SultansOfSwing'" /> 
    <xsl:with-param name="string2"  select="'Swing'" /> 
    <xsl:with-param name="replacement" select="''" /> 
</xsl:call-template> 
+0

Merci pour votre réponse .. pour expliquer ma question mieux c'est ce que je suis en train de faire. Maintenant test sera la valeur récupérée de ma requête SQL et Java. Je veux filtrer davantage cette variable en voyant si un mot se termine par _Swing ... Si c'est le cas, je l'enlève sinon je l'affiche. Je ne sais pas ce que le mot récupéré pourrait être. Pourriez-vous m'aider à mieux comprendre ce scénario? Comment y parvenir? Merci –

+1

Les paramètres de cette fonction peuvent eux-mêmes être des variables, vous n'avez pas à les coder en dur, il suffit de mettre dans les résultats de vos requêtes externes. Si la tâche est simplement "retourner tout (avant une certaine chaîne)" alors une simple ligne XPath 'substring-before (concat ($ variable, $ stopword), $ stopword) fera l'affaire. – Tomalak

4

Donné ce pour l'entrée:

<root> 
    <song>SultansOfSwing</song> 
    <song>SwingOfSultans</song> 
    <song>SultansSwingOf</song> 
</root> 

La sortie de cette:

<?xml version='1.0' ?> 
<root> 
    <swing-less-long>SultansOf</swing-less-long> 
    <swing-less-long>OfSultans</swing-less-long> 
    <swing-less-long>SultansOf</swing-less-long> 
</root> 

peut être obtenu à partir de cela. Notez l'utilisation de substring-before et substring-after.

<?xml version="1.0"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:template match="/"> 
     <root> 
      <xsl:apply-templates select="root/song"/> 
     </root> 
    </xsl:template> 
    <xsl:template match="song"> 
     <swing-less-long> 
      <xsl:if test="contains(., 'Swing')"> 
       <xsl:call-template name="remove"> 
        <xsl:with-param name="value" select="."/> 
       </xsl:call-template> 
      </xsl:if> 
     </swing-less-long> 
    </xsl:template> 
    <xsl:template name="remove"> 
     <xsl:param name="value"/> 
     <xsl:value-of select="concat(substring-before($value, 'Swing'), substring-after($value, 'Swing'))"/> 
    </xsl:template> 
</xsl:stylesheet> 
+0

Merci pour votre réponse .. pour mieux expliquer ma question, c'est ce que j'essaie de faire. Maintenant le test aura la valeur récupérée de mon SQL et requête Java. Je veux filtrer davantage cette valeur de variable en voyant si un mot se termine par _Swing ... Si c'est le cas, je l'enlève sinon je l'affiche. Je ne sais pas ce que le mot récupéré pourrait être. Pourriez-vous m'aider à mieux comprendre ce scénario? Comment y parvenir? Merci –

+0

Je supprime seulement la partie _Swing si elle existe sinon afficher le mot complet. –

+2

Tout d'abord, ne faites pas '- utilisez à la place' '. C'est beaucoup plus efficace pour le moteur XSLT, car vous ne créez pas de document séparé pour la variable. Deuxièmement, '' vous permettra de filtrer les cas se terminant par votre mot-clé Troisièmement, 'substring-before ($ test, '_Swing')' retournera la partie de la chaîne sans le suffixe '_Swing.Tout le reste du code est déjà dessus – lavinio

Questions connexes