2017-10-04 12 views
-1

J'ai fait ce XSLT, mais supprime simplement les caractères non-ASCII.XSLT remplacer non ascii avec l'espace

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:param name="charset" select="'@.1234567890 abcdefghilmnopqrstuvwzkyx ABCDEFGHILMNOPQRSTUVWZYKX'" /> 

<xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="text()"> 
    <xsl:value-of select="translate(., translate(., $charset, ''), '')"/> 
</xsl:template> 

</xsl:stylesheet> 

Je voudrais remplacer à la place par un simple espace. Des indices?

+0

Y aura-t-il une longueur maximale sur les cordes que vous allez ajuster? –

+0

oui max 150 caractères. –

Répondre

1

Si la longueur du texte que vous remplacez est maximale, vous pouvez simplement définir une variable composée de 150 espaces et l'utiliser dans l'expression translate.

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

    <xsl:strip-space elements="*"/> 

    <xsl:param name="charset" select="'@.1234567890 abcdefghilmnopqrstuvwzkyx ABCDEFGHILMNOPQRSTUVWZYKX'" /> 
    <!-- 150 spaces --> 
    <xsl:param name="spaces" select="'                                      '" /> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="text()"> 
     <xsl:value-of select="translate(., translate(., $charset, ''), $spaces)"/> 
    </xsl:template> 
</xsl:stylesheet> 

Si vous pouvez utiliser XSLT 2.0, vous pouvez utiliser la fonction replace, ce qui permet des expressions régulières.

+0

juste parfait! merci beaucoup, je me cognais déjà la tête depuis un moment. –