@Pavel_Minaev ha proporcionado XPath 1.0 amd XPath 2,0 soluciones que funcionan si se sabe de antemano que el número de guiones es 2.
Aquí hay soluciones para el problema más difícil, donde el número de marcas no probadas no es estáticamente conocido (puede ser cualquier número):
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>
cuando esta transformación se aplica a cualquier documento XML (no se utiliza) , el resultado correcto y deseado se produce:
01 solución
¿Qué pasó con el primer guión de su muestra? – Lucero
Buena pregunta (+1). Vea mi respuesta para las soluciones XPath 2.0 y XSLT 1.0 para el problema más general cuando la cantidad de guiones bajos no se conoce de antemano. :) –