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

XSLT过滤引号字符串特殊数据并生成for-each循环正确序列号求助

XSLT 问题修复方案

核心问题对应修复逻辑

  • 匹配误判问题:parent节点存储的是JSON字符串,键名自带双引号,匹配时将当前节点的parent_doc_number值前后拼接双引号后再做包含判断,即可避免2误匹配26这类子串问题;同时过滤掉仅存在_parent_doc_number(带下划线前缀)的无效节点。
  • 序号错误问题:不要先全量遍历节点再用if过滤,直接在for-each的节点选择阶段就完成符合条件节点的筛选,此时遍历的节点集合本身就是过滤后的有效序列,直接调用position()即可得到从1开始的连续序号。

修正后可直接运行的XSLT代码

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
    <xsl:for-each select="/process/TransactionType/data_xml/transaction/sub_documents/transactionLine[exists(parent_doc_number) and contains(/process/TransactionType/data_xml/transaction/parent, concat('&quot;', parent_doc_number, '&quot;'))]">
        <Ref>
            <xsl:value-of select="bidvalue"/>
        </Ref>
        <LineSeq>
            <xsl:value-of select="position()"/>
        </LineSeq>
    </xsl:for-each>
</xsl:template>
</xsl:transform>

调整点说明

  1. 将输出方法从原代码的html改为xml,移除了不必要的DOCTYPE声明,适配XML格式的输出需求
  2. 筛选逻辑直接写在for-each的XPath选择表达式中,提前过滤无效节点,无需在循环内额外加if判断
  3. 匹配JSON键时通过concat('"', parent_doc_number, '"')构造带双引号的匹配串,实现键名精准匹配,彻底解决子串误匹配问题
  4. 由于遍历对象已经是过滤后的有效节点集合,position()函数会直接按有效节点的遍历顺序从1开始计数,无需额外定义计数变量

运行后输出结果与预期完全一致:

<Ref>EATY</Ref>
<LineSeq>1</LineSeq>
<Ref>CLD</Ref>
<LineSeq>2</LineSeq>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:48:18