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

XSLT数据解析问题:提取ORIGINATOR后排除前缀编号的公司名

解决XSLT提取ORIGINATOR字段后排除编号的问题

问题说明

需要从包含大量数据的输入字段中,提取ORIGINATOR:之后、ORIGINATOR BANK:之前的内容,但要排除ORIGINATOR:后开头带符号/字母的长编号,仅提取编号后的公司名称(如示例中的XYZ COMPANY)。

示例数据

SENDERS REFERENCE: 123456789ORIGINATOR: /1234567894 XYZ COMPANY 123 ANYSTREET NEW YORK NY 12345ORIGINATOR BANK: 123456789

现有代码问题

原代码仅通过substring-before和substring-after截取区间内容,无法排除前缀编号:

<OriginatorCompanyInfo>
  <xsl:value-of select="substring-before(substring-after(wd:Addenda,'ORIGINATOR: '),'ORIGINATOR BANK:')"/>
</OriginatorCompanyInfo>

返回结果包含多余编号:

<OriginatorCompanyInfo>/1234567894 XYZ COMPANY 123 ANYSTREET NEW YORK NY 12345</OriginatorCompanyInfo>

尝试在substring-after中直接使用正则表达式无效,因为substring-after仅支持字面量字符串匹配,不支持正则,导致返回空结果。

解决方案

如果使用XSLT 2.0及以上版本,可通过正则替换结合字符串截取实现需求:

方法1:分步处理(可读性高)

<OriginatorCompanyInfo>
  <!-- 第一步:截取ORIGINATOR到ORIGINATOR BANK之间的内容 -->
  <xsl:variable name="originator-section" select="substring-before(substring-after(wd:Addenda, 'ORIGINATOR:'), 'ORIGINATOR BANK:')"/>
  <!-- 第二步:移除开头的编号(匹配开头非空白字符序列+空格) -->
  <xsl:variable name="without-prefix" select="replace($originator-section, '^[^\s]+\s', '')"/>
  <!-- 第三步:提取前两个单词(即公司名称) -->
  <xsl:value-of select="concat(tokenize($without-prefix, '\s+')[1], ' ', tokenize($without-prefix, '\s+')[2])"/>
</OriginatorCompanyInfo>

方法2:单步正则替换(简洁)

利用正则捕获组直接提取目标内容:

<OriginatorCompanyInfo>
  <xsl:value-of select="replace(
    substring-before(substring-after(wd:Addenda, 'ORIGINATOR:'), 'ORIGINATOR BANK:'),
    '^[^\s]+\s(\S+\s\S+).*',
    '$1'
  )"/>
</OriginatorCompanyInfo>

代码说明

  • ^[^\s]+\s:匹配开头的非空白字符序列(包含编号的/和数字)及后续空格,用于移除前缀编号。
  • (\S+\s\S+):捕获编号后的前两个非空白单词(即目标公司名称)。
  • tokenize($without-prefix, '\s+'):将清理后的内容按空格分割为单词数组,取前两个拼接。

结果验证

上述代码会输出:

<OriginatorCompanyInfo>XYZ COMPANY</OriginatorCompanyInfo>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:38:10