BizTalk Map XSLT求助:从XML节点末尾提取纯数字
在BizTalk Map的XSLT中提取字符串开头数字的解决方法
BizTalk默认使用XSLT 1.0,而你尝试的replace()是XSLT 2.0及以上版本的函数,所以会提示“replace是未知函数”。以下是两种适配XSLT 1.0的解决方案:
方法一:递归模板移除末尾非数字字符
这个方法会逐次检查字符串最后一个字符,直到剩下的最后一个字符是数字为止,适合处理末尾带任意非数字内容的场景。
首先在你的XSLT中添加递归模板:
<xsl:template name="TrimNonDigitsAtEnd"> <xsl:param name="targetString"/> <xsl:choose> <!-- 空字符串直接返回 --> <xsl:when test="$targetString = ''"> <xsl:text></xsl:text> </xsl:when> <!-- 最后一个字符是数字,返回当前字符串 --> <xsl:when test="translate(substring($targetString, string-length($targetString)), '0123456789', '') = ''"> <xsl:value-of select="$targetString"/> </xsl:when> <!-- 最后一个字符非数字,递归处理去掉最后一个字符后的字符串 --> <xsl:otherwise> <xsl:call-template name="TrimNonDigitsAtEnd"> <xsl:with-param name="targetString" select="substring($targetString, 1, string-length($targetString) - 1)"/> </xsl:call-template> </xsl:otherwise> </xsl:choose> </xsl:template>
然后在映射中调用该模板(注意节点名的空格需要转义,用方括号语法避免错误):
<xsl:variable name="originalValue" select="ns0:Expiration[local-name()='Calculation']"/> <xsl:call-template name="TrimNonDigitsAtEnd"> <xsl:with-param name="targetString" select="$originalValue"/> </xsl:call-template>
在BizTalk Map里,你可以通过Scripting Functoid实现:选择“Inline XSLT Call Template”类型,把上面的模板代码粘贴进去,再将输入节点连接到该Functoid,Functoid输出连接到目标节点即可。
方法二:提取开头连续数字(适用于数字仅在开头连续的场景)
如果能确定输入字符串的数字是开头连续的,也可以用translate和字符串长度计算来直接提取:
<xsl:variable name="originalValue" select="ns0:Expiration[local-name()='Calculation']"/> <!-- 生成仅包含原字符串中数字的临时字符串 --> <xsl:variable name="allDigits" select="translate($originalValue, translate($originalValue, '0123456789', ''), '')"/> <!-- 取原字符串开头对应长度的子串,保留连续数字 --> <xsl:value-of select="substring($originalValue, 1, string-length($allDigits))"/>
这个方法更简洁,但只适用于数字集中在开头且连续的情况,如果中间穿插非数字会失效。
内容的提问来源于stack exchange,提问作者sameena
相关产品推荐
相关产品推荐

