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('"', parent_doc_number, '"'))]"> <Ref> <xsl:value-of select="bidvalue"/> </Ref> <LineSeq> <xsl:value-of select="position()"/> </LineSeq> </xsl:for-each> </xsl:template> </xsl:transform>
调整点说明
- 将输出方法从原代码的
html改为xml,移除了不必要的DOCTYPE声明,适配XML格式的输出需求 - 筛选逻辑直接写在
for-each的XPath选择表达式中,提前过滤无效节点,无需在循环内额外加if判断 - 匹配JSON键时通过
concat('"', parent_doc_number, '"')构造带双引号的匹配串,实现键名精准匹配,彻底解决子串误匹配问题 - 由于遍历对象已经是过滤后的有效节点集合,
position()函数会直接按有效节点的遍历顺序从1开始计数,无需额外定义计数变量
运行后输出结果与预期完全一致:
<Ref>EATY</Ref> <LineSeq>1</LineSeq> <Ref>CLD</Ref> <LineSeq>2</LineSeq>
内容的提问来源于stack exchange,提问作者HKmar
相关产品推荐
相关产品推荐

