@Pavel_Minaev a fourni des solutions XPath 1.0 amd XPath 2.0 qui fonctionnent si l'on sait à l'avance que le nombre de underscores est 2.
Voici des solutions pour le problème plus difficile, où le nombre de undrscores n'est pas connu statiquement (peut être un nombre quelconque):
XPath 2.0:
translate(substring($s,
1,
index-of(string-to-codepoints($s),
string-to-codepoints('_')
)[last()] -1
),
'_',
''
)
XSLT 1.0:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output method="text"/>
<xsl:variable name="s" select="'ABC_12345_Q-10'"/>
<xsl:template match="/">
<xsl:call-template name="stripLast">
<xsl:with-param name="pText" select="$s"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="stripLast">
<xsl:param name="pText"/>
<xsl:param name="pDelim" select="'_'"/>
<xsl:if test="contains($pText, $pDelim)">
<xsl:value-of select="substring-before($pText, $pDelim)"/>
<xsl:call-template name="stripLast">
<xsl:with-param name="pText" select=
"substring-after($pText, $pDelim)"/>
<xsl:with-param name="pDelim" select="$pDelim"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
lorsque cette transformation est appliqué à un document XML (non utilisé) , le résultat désiré et correct est produit:
ABC12345
Qu'est-ce qui est arrivé avec le premier trait de soulignement dans votre échantillon? – Lucero
Bonne question (+1). Voir ma réponse pour les solutions XPath 2.0 et XSLT 1.0 au problème plus général lorsque le nombre de caractères de soulignement n'est pas connu à l'avance. :) –