2010-06-09 4 views
3
espaces blancs

J'ai un xml/tei commeComment « l'effondrement », mais pas « normaliser » dans XLST

<p> In trattoria scoprii che c'era <del rend="tratto a matita">anche</del> Mirella, 
       non la non vedevo da almeno sei anni. 
       La spianata dava infatti l'impressione di fango secco, <del rend="matita">divorato 
        dalle rughe</del><add place="margine sinistro" rend="matita">attraversato da 
        lunghe ferite nere</add>. Lontano si vedeva una montagna di creta dello 
       stesso colore della mota. </p> 

J'utilise cette feuille de style pour éliminer les espaces blancs, aussi bien entre les éléments et à l'intérieur des noeuds de texte.

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

<xsl:template match="/"> 
    <xsl:apply-templates /> 
</xsl:template> 

<xsl:template match="*"> 
    <xsl:copy> 
     <xsl:for-each select="@*"> 
      <xsl:attribute name="{name()}"> 
       <xsl:value-of select="normalize-space()"/> 
      </xsl:attribute> 
     </xsl:for-each> 
     <xsl:apply-templates/> 
    </xsl:copy> 
</xsl:template> 
<xsl:template match="text()"> 
    <xsl:value-of select="normalize-space()"/> 
</xsl:template> 

Tout va bien exepté le fait que l'espace normalise() Retire également leader et espaces blancs alignées à, j'ai donc un comportement undesidered comme

c'era<del rend="tratto a matita">anche</del>Mirella 

Je ne peux pas exclure du contenu en mode mixte former la suppression, car mon premier besoin est de réduire espaces comme les retours, les onglets, l'identification à l'intérieur, par exemple, l'élément <p>.

Existe-t-il un moyen/une fonction/astuce pour réduire plusieurs espaces dans un seul espace sans supprimer les espaces de début et de fin?

Répondre

1

Je ne pense pas qu'il y ait une fonction intégrée pour ce faire facilement, mais (au moins en XPath 2) il y a une assez complète regular expression language avec une fonction replace() que vous devriez être en mesure de convaincre de faire ce que vous vouloir. (Avec une introduction plus lisible à xml.com).

Je pense que tout ce que vous devez faire est de remplacer:

select="normalize-space()" 

avec

select="replace(., '(\s\s+)', ' ')" 

mais je ne l'ai pas testé cela.

Editer: Correction du premier argument de remplacement, comme indiqué par Mycol ci-dessous.

+0

Merci. Cela a fonctionné mais avec select = "replace (., '(\ S \ s +)', '')" – Mycol

+0

Excellent. Je serais intéressé de savoir ce que vous utilisez pour traiter le XSLT car je ne suis pas sûr à 100% que c'est entièrement portable. –

+0

Saxon 9.2 Édition familiale – Mycol