如何用XSLT提取<cp>标签数字前两位?解决类型比较错误
解决XSLT字符串与整数比较错误,实现提取CP前两位数字的需求
问题拆解
你碰到的「无法将字符串与整数比较」错误,主要是两个细节没处理好:
substring函数用错了:XSLT里的substring是从索引1开始计数的,你写的substring(cp,2)会从第2个字符开始往后截(比如08350会得到8350),完全不是取前两位的逻辑。- 类型不匹配:你把截取后的字符串和整数
08对比,XSLT会自动尝试类型转换,但整数08会被当成8,而字符串的前两位是"08",这就导致了类型冲突的报错,而且逻辑上也不对。
另外还有个小问题:你的XPath路径extraccio/objRegistral/dades_generals/adreca和提供的XML结构不匹配,XML里<adreca>是直接在<objRegistral>下面的,没有<dades_generals>节点,这个路径得修正,不然根本找不到目标节点。
修正后的代码
下面是调整后的XSLT 2.0代码,完美实现你的需求:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <xsl:template match="/"> <campings> <!-- 修正路径+正确截取前两位+字符串类型比较 --> <xsl:for-each select="extraccio/objRegistral/adreca[substring(cp, 1, 2) = '08']"> <camping> <nom><xsl:value-of select="municipi"/></nom> </camping> </xsl:for-each> </campings> </xsl:template> </xsl:stylesheet>
关键修改点解释
- 截取前两位:用
substring(cp, 1, 2),三个参数分别是:目标字符串、起始索引(1开始)、截取长度,这样就能准确拿到<cp>的前两位字符。 - 字符串比较:把对比值写成
'08'(带单引号的字符串),确保和截取出来的字符串是同类型,避免类型转换错误。 - 修正XPath路径:去掉了不存在的
dades_generals节点,让路径和你的XML结构对应。
可选的严谨优化
如果想要确保<cp>是有效的5位数字(避免空值、非数字等情况干扰),可以加上正则校验:
<xsl:for-each select="extraccio/objRegistral/adreca[matches(cp, '^\d{5}$') and substring(cp, 1, 2) = '08']">
这个表达式会先验证<cp>是标准的5位数字,再判断前两位是否为08,结果更可靠。
内容的提问来源于stack exchange,提问作者Mohamed A.B
相关产品推荐
相关产品推荐

