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

能否用XSLT 1.0修正多XML文件合并的语法问题?

问题

我想确认是否可以通过XSLT 1.0映射修正输入XML文件的语法问题,但没找到相关资料,请问这是否可行?输入是多个XML文件的组合,示例如下:

输入

<?xml version="1.0" encoding="UTF-8"?>
<HEADER>
    <CHILD BEGIN="1">
        <RECORD SEGMENT="1">
            <FIELD1>value1</FIELD1>
            <FIELD2>2</FIELD2>      
        </RECORD>       
    </CHILD>
</HEADER>
<?xml version="1.0" encoding="UTF-8"?>
<HEADER>
    <CHILD BEGIN="1">
        <RECORD SEGMENT="1">
            <FIELD1>value2</FIELD1>
            <FIELD2>3</FIELD2>

        </RECORD>   
    </CHILD>
</HEADER>

期望输出

<?xml version="1.0" encoding="UTF-8"?>
<HEADER>
    <CHILD BEGIN="1">
        <RECORD SEGMENT="1">
            <FIELD1>value1</FIELD1>
            <FIELD2>2</FIELD2>      
        </RECORD>       
    </CHILD>

    <CHILD BEGIN="1">
        <RECORD SEGMENT="1">
            <FIELD1>value2</FIELD1>
            <FIELD2>3</FIELD2>

        </RECORD>   
    </CHILD>
</HEADER>

解决方案

首先明确:标准XSLT 1.0处理器只能处理格式良好的XML文档,你的输入是两个完整XML拼接的结果,包含多个XML声明和根节点,属于格式不良的XML,无法直接用XSLT 1.0解析处理,但可以通过组合方式实现需求:

  1. 预处理输入内容
    先移除多余的XML声明,把多个<HEADER>节点包裹到一个临时根节点下,将输入转换成格式良好的XML,预处理后示例如下:
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
    <HEADER>
        <CHILD BEGIN="1">
            <RECORD SEGMENT="1">
                <FIELD1>value1</FIELD1>
                <FIELD2>2</FIELD2>      
            </RECORD>       
        </CHILD>
    </HEADER>
    <HEADER>
        <CHILD BEGIN="1">
            <RECORD SEGMENT="1">
                <FIELD1>value2</FIELD1>
                <FIELD2>3</FIELD2>

            </RECORD>   
        </CHILD>
    </HEADER>
</ROOT>
  1. 编写XSLT 1.0转换规则
    针对预处理后的良构XML,编写XSLT将所有<HEADER>下的<CHILD>节点合并到一个<HEADER>中,示例代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="/ROOT">
        <HEADER>
            <!-- 遍历所有HEADER节点下的CHILD元素 -->
            <xsl:apply-templates select="HEADER/CHILD"/>
        </HEADER>
    </xsl:template>

    <!-- 原样复制CHILD及其所有子节点 -->
    <xsl:template match="CHILD">
        <xsl:copy-of select="."/>
    </xsl:template>
</xsl:stylesheet>

如果你的环境支持扩展工具(比如结合Python/Perl脚本先处理输入),也可以直接对原始格式不良的内容做处理,但这已经超出了标准XSLT 1.0的范畴。

总结:通过「预处理+XSLT 1.0转换」的组合方式,完全可以实现你要的效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 18:34:55