2010-08-06 7 views
1

J'ai des URL avec des caractères spéciaux et je voudrais les remplacer et j'utilise xslt 1.0 donc j'écris le code comme ci-dessous.xslt1.0 remplacer ne fonctionne pas

<xsl:template name="string-replace-all"> 
     <xsl:param name="text"/> 
     <xsl:param name="replace"/> 
     <xsl:param name="by"/> 
     <xsl:choose> 
      <xsl:when test="contains($text,$replace)"> 
       <xsl:value-of select="substring-before($text,$replace)"/> 
       <xsl:value-of select="$by"/> 
       <xsl:call-template name="string-replace-all"> 
        <xsl:with-param name="text" select="substring-after($text,$replace)"/> 
        <xsl:with-param name="replace" select="$replace"/> 
        <xsl:with-param name="by" select="$by"/> 
       </xsl:call-template> 
      </xsl:when> 
    <xsl:otherwise> 
     <xsl:value-of select="$text"/> 
    </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

et appeler comme ceci:

<td class="ms-vb"> 
      <xsl:variable name="link"> 
      <xsl:call-template name="string-replace-all"> 
       <xsl:with-param name="text" select="@FileRef"/> 
       <xsl:with-param name="replace" select="'&#39;'"/> 
       <xsl:with-param name="by" select="'%27'"/> 
      </xsl:call-template> 
      </xsl:variable>--> 
       <a target="_blank" href="@link" ><xsl:value-of select="@New_x0020_Doc_x0020_Title" disable-output-escaping="yes" /></a> 
      </td> 

Je reçois l'erreur "webpart ne peut pas être affichée". Quelqu'un peut-il suggérer ce que je fais mal ici?

+0

Bonne question (+1). Voir ma réponse pour l'explication et la solution complète. –

Répondre

2

Le modèle de "remplacement" fourni est et fonctionne.

Pour confirmer cela, utilisez la transformation suivante:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes" indent="yes"/> 

    <xsl:template match="/*"> 
     <xsl:variable name="link"> 
      <xsl:call-template name="string-replace-all"> 
       <xsl:with-param name="text" select="@FileRef"/> 
       <xsl:with-param name="replace">'</xsl:with-param> 
       <xsl:with-param name="by" select="'%27'"/> 
      </xsl:call-template> 
     </xsl:variable> 

     "<xsl:value-of select="$link"/>" 
    </xsl:template> 

    <xsl:template name="string-replace-all"> 
     <xsl:param name="text"/> 
     <xsl:param name="replace"/> 
     <xsl:param name="by"/> 
     <xsl:choose> 
      <xsl:when test="contains($text,$replace)"> 
       <xsl:value-of select="substring-before($text,$replace)"/> 
       <xsl:value-of select="$by"/> 
       <xsl:call-template name="string-replace-all"> 
        <xsl:with-param name="text" select="substring-after($text,$replace)"/> 
        <xsl:with-param name="replace" select="$replace"/> 
        <xsl:with-param name="by" select="$by"/> 
       </xsl:call-template> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$text"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

lorsque la transformation est appliquée sur ce document XML:

<t FileRef="Abc'Xyz'Tuv"/> 

le résultat recherché, correct est produit:

"Abc%27Xyz%27Tuv" 

Le problème est peut-être dans la façon dont vous spécifiez le paramètre replace (nombre impair de apostrophes dans l'expression):

Au lieu de:

<xsl:with-param name="replace" select="'&#39;'"/> 

Utilisation:

<xsl:with-param name="replace">'</xsl:with-param> 
+0

+1 Bonne prise! Aussi cela fonctionnerait: '' –

+0

En fait, nous avons constaté que le problème est avec sharepoint. Une fois que l'utilisateur a renommé les fichiers, tout a bien fonctionné. Merci pour la réponse. J'espère que j'utiliserai ceci plus tard. – user346514

+0

@ user346514: Votre commentaire est erroné. Cette déclaration '' produire cette erreur: 'Une chaîne littérale n'était pas fermée'. –