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

XSLT 2.0遍历XML匹配节点时如何获取连续position()序号

问题根因

你获取的序号不连续,是因为position()函数返回的是当前节点在原始遍历的完整节点集中的位置,而非过滤后符合条件的节点序列的位置。原有逻辑是先遍历所有$XMLB/Root节点,不符合条件的节点只是不输出内容,但position()仍会按原始遍历顺序计数,自然会出现跳号。
另外你原有代码中$Fieldvalue的赋值存在错误:select="/Field"开头的/会定位到整个XML文档的根节点,无法获取当前遍历的<Root>节点下的Field值,需要改为相对路径Field。

解决方案

最优实现(推荐)

将过滤条件直接写在for-each的select表达式中,先筛选出所有符合条件的<Root>节点再遍历,此时position()返回的就是符合条件节点的连续序号:

<xsl:for-each select="$XMLB/Root[Field = $XMLA/Row/Column]">
    <!-- 输出连续递增序号 -->
    <xsl:value-of select="position()"/>
    <!-- 其他需要输出的内容可在此处添加 -->
</xsl:for-each>

大数据量优化方案

如果XML A的<Row>节点数量很大,为了提升匹配效率,可以用XSLT的key实现匹配:

  1. 先在全局定义匹配键:
<xsl:key name="columnVal" match="P_OUT_PARTNUMBERS/Row/Column" use="."/>
  1. 遍历写法调整为:
<xsl:for-each select="$XMLB/Root[key('columnVal', Field, $XMLA)]">
    <xsl:value-of select="position()"/>
</xsl:for-each>

验证效果

针对你给出的示例XML,上述代码会输出连续序号1,如果XML B中新增<Root><Field>54</Field></Root>节点,会依次输出1、2,完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:24:03