XSLT:查找字符串中的最后一次出现
Posted
技术标签:
【中文标题】XSLT:查找字符串中的最后一次出现【英文标题】:XSLT: Finding last occurence in a string 【发布时间】:2011-03-09 16:23:48 【问题描述】:给定一个表格编号,例如:
ABC_12345_Q-10
我想结束:
ABC12345
所以我需要找到第二个下划线的位置
请注意,下划线之间的任何“部分”都没有标准模式或长度(因此我不能使用子字符串来简单地消除最后一个部分)。
xPath 2.0 解决方案还可以。
【问题讨论】:
示例中的第一个下划线发生了什么? 好问题 (+1)。当事先不知道下划线的数量时,请参阅我对 XPath 2.0 和 XSLT 1.0 解决更普遍问题的回答。 :) 【参考方案1】:@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
【讨论】:
【参考方案2】:XSLT 2.0 中更简单的解决方案:
codepoints-to-string(reverse(string-to-codepoints(
substring-before(
codepoints-to-string(reverse(string-to-codepoints($s))), '_'))))
使用'substring-before',您将获得所有after 的最后 次出现的分隔符(下划线)。 如果您改用 'substring-after',您将获得所有 before 的 last 分隔符。
【讨论】:
【参考方案3】:concat(
substring-before($s, '_'),
substring-before(substring-after($s, '_'), '_')
)
或者:
string-join(tokenize($s, '_')[position() <= 2], '')
【讨论】:
【参考方案4】:广义一-
substring($string,1, string-length($string)-string-length(str:split($string, '_')[count(str:split($string, '_'))]))
想法是通过拆分字符串来获取最后出现的索引。
最后出现的索引 = string-length($string) - 拆分后最后一个字符串的长度
【讨论】:
依赖于只有少数处理器支持的扩展函数的解决方案几乎不是“通用的”。以上是关于XSLT:查找字符串中的最后一次出现的主要内容,如果未能解决你的问题,请参考以下文章