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
相关产品推荐
相关产品推荐

