Question

Je veux couper les espaces à gauche et à droite en:
<xsl:value-of select="Datas/Data[@key='Name']/string"/>

Comment puis-je faire?

Était-ce utile?

La solution

La façon la plus simple est d'utiliser la fonction de modèle de trim de FXSL .

Cette transformation :

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="trim.xsl"/>
<xsl:output method="text"/>

  <xsl:template match="/">
    '<xsl:call-template name="trim">
        <xsl:with-param name="pStr" select="string(/*)"/>
    </xsl:call-template>'
  </xsl:template>
</xsl:stylesheet>

lorsqu'il est appliqué sur ce document XML :

<someText>

   This is    some text   

</someText>

produit le voulait, résultat correct :

'This is    some text'

Comment fonctionne trim :

Il est facile d'éliminer tous les caractères blancs à partir d'une chaîne, mais la partie difficile est d'éliminer tous les caractères de fin de blancs.

La fonction trim de FXSL / modèle atteint cela en utilisant un autre modèle / fonction de FXSL pour inverser une chaîne.

Ainsi, le traitement va comme ceci :

  1. Éliminer les principaux espaces blancs.

  2. Inverser le résultat.

  3. Éliminer les principaux espaces.

  4. Enfin inverse.

Le code complet pour trim() dans FXSL 2.0 (pour XSLT 2.0) peut être vu ici . Il est presque le même que le code pour le modèle de trim de FXSL 1.0 (pour XSLT 1.0).

Autres conseils

normalize-space(Datas/Data[@key='Name']/string) pourrait suffire, il coupera l'espace blanc et le début et la fin. Il ne cependant effondrement également un espace blanc entre un seul espace, je ne sais pas si vous voulez que.

Offrant une autre solution que j'utilise dans XSLT 2.0 car il est plus concis et précis (Normaliser l'espace n'est pas une garniture).

Utilisation de la fonction de remplacement et une expression régulière pour saisir le contenu interne, moins la précédente et de fuite des espaces.

replace(Datas/Data[@key='Name']/string,'^\s*(.+?)\s*$', '$1')

Comparez la solution @ ricosrealm, pour les utilisateurs XSLT2, avec le @ de Dimitre pour XSLT1 (et aussi vérifier le nombre de lignes du FXSL-trim). La fonction remplacer l'expression régulière est si simple, passer moins de temps CPU et moins de temps de programmeur.

Pour XSLT1 utilisateurs en 2013

Si vous est un utilisateur de XSLT1, est probablement parce que vous avez pas le choix d'utiliser XSLT2. Exemple: PHP dépend de LibXML2 implementatin, qui stoped dans la norme 1999, ne met en œuvre la norme de 2007. Aujourd'hui (2013) ne représente qu'une fraction des utilisateurs XSLT1 faire cela par des considérations de performance.

si vous suppose que vous est pris au piège par XSLT1 et votre cadre, est le temps de connaître et d'utiliser des "fonctions enregistrées" , comme sur PHP (mais tout autre comme Python ou Javascript en utilisant LibXML2 peut utiliser extensions de libxml2 ), à se rapprocher de la liberté XSLT2 / fonctionnalité.
Voir XSLTProcessor :: registerPHPFunctions sur votre langue.

Exemple PHP:

  <xsl:value-of 
       select="php:functionString( 'trim', Datas/Data[@key='Name']/string )"
  />

NOTE (modifiée): pour les implémentations non-libxml2, comme à des cadres Microsoft (.NET), comme le montre par @ChristopheDebove (commentaires ci-dessous), il existe également des solutions pour les fonctions enregistrées. Bien sûr, pour Java il y a SAXON, la seule bonne source ouverte de XSLT2 aujourd'hui.

... Si un jour (voir opinions quand et here ) vous remplacez XSLT1 par XSLT2 dans le même cadre (ex. PHP), vous pas besoin de changer vos scripts XSLT, car est prévu que les fonctions seront enregistrées auprès de la même.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top