4 votes

extraire le texte entre guillemets simples dans XSLT

Il faudrait extraire le texte après le guillemets simples .

Par exemple :

<div>('show')</div>

Les variables sont les suivantes :

<xsl:variable name="showName" select="substring-before(substring-after(//x:div, '%28%27'), '%27%29')" />

Le résultat est nul, le codage des caractères .

Je pense qu'il ne peut pas être utilisé %28%27 y %27%29 . C'est correct ?

Merci.

5voto

Dimitre Novatchev Points 147842

XSLT 1.0 :

Il suffit d'utiliser :

 <xsl:variable name="vshowName" select=
 'substring-before(substring-after(/*, "&apos;"), "&apos;")'/>

Voici une transformation complète :

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

 <xsl:variable name="vshowName" select=
 'substring-before(substring-after(/*, "&apos;"), "&apos;")'/>

 <xsl:template match="/*">
  <xsl:value-of select="$vshowName"/>
 </xsl:template>
</xsl:stylesheet>

Lorsqu'il est appliqué sur le document XML fourni :

<div>('show')</div>

le résultat voulu et correct est produit :

show

XSLT 2.0 :

Dans XSLT 2.0, on peut utiliser l'une des deux approches suivantes :

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

 <xsl:variable name="vPattern">
  ^[^']*'([^']*)'.*$
 </xsl:variable>

 <xsl:variable name="vshowName1" select="replace(/*, $vPattern, '$1', 'x')"/>

 <xsl:variable name="vshowName2" select=
 'replace(/*, "^[^&apos;]*&apos;([^&apos;]*)&apos;.*$", "$1", "x")'/>

 <xsl:template match="/*">
  <xsl:value-of select="$vshowName2"/>
===============
  <xsl:value-of select="$vshowName1"/>
 </xsl:template>
</xsl:stylesheet>

Lorsque cette transformation est appliquée sur le même document XML (ci-dessus), l'évaluation des deux expressions XPath produit le même résultat :

show
===============
show

Prenez note :

Si vous voulez avec une seule expression Xpath (faisant xsl:analyze-string inutile) pour extraire/traiter tous des sous-chaînes entourées de guillemets (où le nombre de ces sous-chaînes est illimité), voir cette réponse :

https://stackoverflow.com/a/15402185/36305

Enfin, en utilisant xsl:analyze-string :

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

 <xsl:template match="/*">
  <xsl:analyze-string select="." regex="'(.*?)'">
   <xsl:matching-substring>
     <xsl:sequence select="regex-group(1)"/>
   </xsl:matching-substring>
  </xsl:analyze-string>
 </xsl:template>
</xsl:stylesheet>

Lorsque cette transformation est appliquée sur le document XML suivant :

<div>('word1', 'word2', 'word3')</div>

le résultat correct est produit :

word1 word2 word3

Ce code (d'une autre réponse) est faux :

<xsl:analyze-string select="//div" regex="'(.*)'">
  <xsl:matching-substring>
    <xsl:value-of select="regex-group(1)"/>
  </xsl:matching-substring>
  <xsl:non-matching-substring>
    <xsl:value-of select="."/>
  </xsl:non-matching-substring>
</xsl:analyze-string>

Lorsqu'il est appliqué sur le document XML ci-dessus, il produit :

(word1', 'word2', 'word3)

0voto

Édouard Lopez Points 2762

Techniques

Si vous êtes familier avec expression régulière vous pouvez également utiliser <xsl:analyze-string> .

Exemple de code

Extraire le contenu entre les guillemets simples. Le contenu est ensuite référencé en utilisant regex-group(1) ) :

<xsl:analyze-string select="//x:div" regex="'(.*)'">
  <xsl:matching-substring>
    <xsl:value-of select="regex-group(1)"/>
  </xsl:matching-substring>
  <xsl:non-matching-substring>
    <xsl:value-of select="."/>
  </xsl:non-matching-substring>
</xsl:analyze-string>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X