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

如何用XSLT提取XML中首个不以'B'开头的Num元素值?

XSLT提取首个不以指定字符开头的元素值失败的解决方法

问题场景

我需要从XML中提取首个不以'B'开头的Num元素值,但当前XSLT代码输出了多个符合条件的值,不符合预期。

输入XML:

<Group>
    <map>
        <Num>B123456</Num>
    </map>
    <map>
        <Num>555555</Num>
    </map>
    <map>
        <Num>666666</Num>
    </map>
    <map>
        <Num>B65432</Num>
    </map>
</Group>

尝试的XSLT代码:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
   <xsl:output encoding="UTF-8" indent="yes" />
   <xsl:template match="Group">
       <groupNumber>
          <xsl:value-of select="map/Num[not(starts-with(., 'B'))][1]"/>
       </groupNumber>
   </xsl:template>
</xsl:transform>

实际输出:

<groupNumber>555555 666666</groupNumber>

期望输出:

<groupNumber>555555</groupNumber>

问题原因

XPath表达式的优先级导致了意外结果:map/Num[not(starts-with(., 'B'))][1]会被解析为对每个map元素,筛选其下符合条件的Num并取第一个,最终收集到两个符合条件的节点(555555和666666)。而xsl:value-of在XSLT 2.0中默认会将多个节点的字符串值用空格拼接输出,因此得到了两个值。

解决方案

通过括号明确表达式优先级,先筛选出所有符合条件的Num节点,再从整体节点集中取第一个:

修正后的XSLT代码:

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
   <xsl:output encoding="UTF-8" indent="yes" />
   <xsl:template match="Group">
       <groupNumber>
          <xsl:value-of select="(map/Num[not(starts-with(., 'B'))])[1]"/>
       </groupNumber>
   </xsl:template>
</xsl:transform>

验证结果

执行修正后的代码,输出与期望一致:

<groupNumber>555555</groupNumber>

内容的提问来源于stack exchange,提问作者User501

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:30:56