XSLT中如何提取固定位置、长度可变的子字符串?
最优提取方案(XSLT)
你需要从冒号分隔的字符串里提取第3个分段QE1_300,最简洁高效的方式是用tokenize()函数结合索引定位,比循环判断更直接。
问题分析
你尝试的代码存在语法错误:myRef['[^:]*']不是正确的XPath表达式,没法实现拆分字符串的效果。要拆分冒号分隔的字符串,必须用tokenize()函数。
最优实现方式
方式1:直接通过索引获取(推荐)
在XSLT 2.0及以上版本中,tokenize()返回的是序列,直接通过下标就能定位到目标分段:
<xsl:value-of select="tokenize('xri:roughgoing:QE1_300:whatwasthis:majorleague:FC:Hungary', ':')[3]"/>
这里用[3]是因为拆分后的序列依次是:
xriroughgoingQE1_300
如果你的myRef是存储该字符串的变量或节点,替换成tokenize(myRef, ':')[3]即可。
方式2:循环遍历(不推荐,仅作对比)
如果一定要用循环,修正后的代码如下:
<xsl:for-each select="tokenize(myRef, ':')"> <xsl:if test="position() = 3"> <xsl:value-of select="."/> </xsl:if> </xsl:for-each>
但这种写法比直接索引繁琐,没必要使用。
关于matches()的说明
matches()函数仅用于判断字符串是否匹配正则,无法直接提取子串,所以不适合用来实现你的需求。
内容的提问来源于stack exchange,提问作者Abraham Brink
相关产品推荐
相关产品推荐

