XSLT提取无空格键值串中17=对应值时如何去除多余字符?
解决XSLT提取键17对应值的问题
我懂你的困扰啦!你当前的XSLT代码之所以多出来末尾的20,是因为substring-before(substring-after(.,'17='), '=')只会找17=之后第一个=的位置,而你的下一个键是20=,所以这个=前面的20会被一起包含到结果里,导致输出变成MG127AJ4015AG1A20。
下面针对不同XSLT版本给你对应的解决方案:
XSLT 2.0及以上版本(推荐)
利用正则表达式可以轻松搞定这个问题,直接匹配17=之后到第一个数字+等号之前的内容:
<xsl:value-of select="replace(., '.*17=(.*?)([0-9]+=).*', '$1')"/>
这个表达式的逻辑很清晰:
.*17=:匹配到17=之前的所有内容(.*?):非贪婪匹配17=之后的内容(也就是我们要的目标值)([0-9]+=):匹配下一个键的开头(数字+等号)$1:提取第一个括号里匹配到的目标内容
XSLT 1.0版本(无正则支持)
因为XSLT1.0没有原生正则,我们可以写一个递归模板来逐个字符判断,直到遇到下一个键的开头(数字)为止:
<xsl:template name="extract-17-value"> <xsl:param name="remaining-text"/> <xsl:choose> <!-- 如果当前剩余文本以数字开头,说明到下一个键了,停止递归 --> <xsl:when test="starts-with($remaining-text, '0') or starts-with($remaining-text, '1') or starts-with($remaining-text, '2') or starts-with($remaining-text, '3') or starts-with($remaining-text, '4') or starts-with($remaining-text, '5') or starts-with($remaining-text, '6') or starts-with($remaining-text, '7') or starts-with($remaining-text, '8') or starts-with($remaining-text, '9')"> </xsl:when> <xsl:otherwise> <!-- 输出当前第一个字符,然后递归处理剩余文本 --> <xsl:value-of select="substring($remaining-text, 1, 1)"/> <xsl:call-template name="extract-17-value"> <xsl:with-param name="remaining-text" select="substring($remaining-text, 2)"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template>
调用这个模板的时候,先传入17=之后的文本:
<xsl:call-template name="extract-17-value"> <xsl:with-param name="remaining-text" select="substring-after(., '17=')"/> </xsl:call-template>
这样就能准确提取到MG127AJ4015AG1A这个目标值啦!
内容的提问来源于stack exchange,提问作者Akanksha Mishra
相关产品推荐
相关产品推荐

