XSLT 1.0特定竖线间子字符串提取的简化方法问询
提取竖线分隔字符串中特定字段的简便方法
XSLT 2.0及以上版本
直接用tokenize()函数把字符串按|分割成序列,通过索引就能快速获取对应字段(XSLT序列索引从1开始):
比如提取你例子里第2个字段(第一个|和第二个|之间的5000935):
<td><xsl:value-of select="tokenize(., '\|')[2]"/></td>
要是想提取其他位置的字段,直接改索引就行。比如拿第5个字段(139566.66):
<td><xsl:value-of select="tokenize(., '\|')[5]"/></td>
空字段也能正确处理,比如第4个字段是空的,tokenize(., '\|')[4]会返回空字符串,完全符合需求。
XSLT 1.0版本
因为1.0没内置tokenize,可以写个递归模板来实现分割,之后通过索引取字段:
先定义递归模板:
<xsl:template name="get-field"> <xsl:param name="string" select="."/> <xsl:param name="index" select="1"/> <xsl:param name="delimiter" select="'|'"/> <xsl:choose> <xsl:when test="$index = 1"> <xsl:value-of select="substring-before(concat($string, $delimiter), $delimiter)"/> </xsl:when> <xsl:when test="contains($string, $delimiter)"> <xsl:call-template name="get-field"> <xsl:with-param name="string" select="substring-after($string, $delimiter)"/> <xsl:with-param name="index" select="$index - 1"/> <xsl:with-param name="delimiter" select="$delimiter"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:text></xsl:text> </xsl:otherwise> </xsl:choose> </xsl:template>
调用模板获取指定字段,比如第2个字段:
<td> <xsl:call-template name="get-field"> <xsl:with-param name="index" select="2"/> </xsl:call-template> </td>
要提取其他位置,改select="2"里的数字就行,空字段同样能正确返回空值。
这种方法比嵌套substring-before/substring-after简洁太多,不管提取哪个位置的字段,只需要调整索引,不用写多层嵌套的复杂表达式。
内容的提问来源于stack exchange,提问作者Meruem81
相关产品推荐
相关产品推荐

