You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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>

关键修改点解释

  1. 截取前两位:用substring(cp, 1, 2),三个参数分别是:目标字符串、起始索引(1开始)、截取长度,这样就能准确拿到<cp>的前两位字符。
  2. 字符串比较:把对比值写成'08'(带单引号的字符串),确保和截取出来的字符串是同类型,避免类型转换错误。
  3. 修正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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:02:06