给出如下表格编号:
ABC_12345_Q-10
我想最终:
ABC12345
所以我需要找到第二个下划线的位置
请注意,下划线之间的任何“部分”都没有标准模式或长度(因此我不能使用子字符串来简单地删除最后一部分)。
xPath 2.0解决方案没问题。
答案 0 :(得分:11)
@Pavel_Minaev提供了XPath 1.0和XPath 2.0解决方案,如果事先知道下划线的数量为2,则该解决方案有效。
以下是更难解决的问题的解决方案,其中未分析的数量不是静态的(可能是任何数字):
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>
将此转换应用于任何XML文档(未使用)时,会生成所需的正确结果:
ABC12345
答案 1 :(得分:5)
XSLT 2.0中更容易的解决方案:
codepoints-to-string(reverse(string-to-codepoints(
substring-before(
codepoints-to-string(reverse(string-to-codepoints($s))), '_'))))
使用'substring-before',您将获得 > >分隔符(下划线)之后的所有内容。
如果您改为使用'substring-after',那么您将获得 > 答案 2 :(得分:2) 可替换地: 答案 3 :(得分:0) 广义的 - 想法是通过拆分字符串来获取最后一次出现的索引。 最后一次出现的索引=字符串长度($ string) - 分割后的最后一个字符串的长度concat(
substring-before($s, '_'),
substring-before(substring-after($s, '_'), '_')
)
string-join(tokenize($s, '_')[position() <= 2], '')
substring($string,1, string-length($string)-string-length(str:split($string, '_')[count(str:split($string, '_'))]))