XSLT 1.0 :
Il suffit d'utiliser :
<xsl:variable name="vshowName" select=
'substring-before(substring-after(/*, "'"), "'")'/>
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(/*, "'"), "'")'/>
<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(/*, "^[^']*'([^']*)'.*$", "$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)