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

如何使用XSLT将线性XML结构转换为父子节点结构

用XSLT将线性XML转换为父子节点结构

首先我先把你提供的截断XML补全成合理的完整版本(方便演示):

<?xml version='1.0' encoding='UTF-8'?>
<MESSAGE>
    <ORDER>
        <NAME>HEADER</NAME>
        <ORDER_NO>100</ORDER_NO>
        <ADDRESS>Posted</ADDRESS>
    </ORDER>
    <ORDER>
        <NAME>DETAIL</NAME>
        <LINE_NO>1</LINE_NO>
        <QTY>1</QTY>
    </ORDER>
    <ORDER>
        <NAME>DETAIL</NAME>
        <LINE_NO>2</LINE_NO>
        <QTY>1</QTY>
    </ORDER>
</MESSAGE>

核心需求应该是把NAME="HEADER"的<ORDER>作为父节点,后续所有NAME="DETAIL"的<ORDER>作为它的子节点对吧?下面是实现这个转换的XSLT:

<?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" indent="yes"/>

    <!-- 匹配根节点MESSAGE -->
    <xsl:template match="/MESSAGE">
        <xsl:copy>
            <!-- 定位到HEADER类型的ORDER节点 -->
            <xsl:variable name="headerNode" select="ORDER[NAME='HEADER']"/>
            <HEADER_ORDER>
                <!-- 复制HEADER节点的所有子内容 -->
                <xsl:copy-of select="$headerNode/*"/>
                <!-- 嵌套所有DETAIL类型的ORDER节点作为子项 -->
                <DETAIL_LIST>
                    <xsl:for-each select="ORDER[NAME='DETAIL']">
                        <DETAIL_ITEM>
                            <xsl:copy-of select="*"/>
                        </DETAIL_ITEM>
                    </xsl:for-each>
                </DETAIL_LIST>
            </HEADER_ORDER>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

转换后的输出会是清晰的父子结构:

<?xml version="1.0" encoding="UTF-8"?>
<MESSAGE>
    <HEADER_ORDER>
        <NAME>HEADER</NAME>
        <ORDER_NO>100</ORDER_NO>
        <ADDRESS>Posted</ADDRESS>
        <DETAIL_LIST>
            <DETAIL_ITEM>
                <NAME>DETAIL</NAME>
                <LINE_NO>1</LINE_NO>
                <QTY>1</QTY>
            </DETAIL_ITEM>
            <DETAIL_ITEM>
                <NAME>DETAIL</NAME>
                <LINE_NO>2</LINE_NO>
                <QTY>1</QTY>
            </DETAIL_ITEM>
        </DETAIL_LIST>
    </HEADER_ORDER>
</MESSAGE>

如果你的实际场景里有多个HEADER节点,或者需要调整节点命名,只需要修改XSLT里的节点名称和选择条件就可以灵活适配~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:25:20