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

XSLT仅输出Header节点异常求助:转换结果不符合预期

XSLT转换问题:保留Root与Header节点的正确实现

需求说明

需要从给定XML中仅保留Root节点及其包含的Header子节点(含Header的所有子元素),最终输出结构需包含完整的Root和Header层级。

输入XML

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <Header>
        <employeeType>FTE</employeeType>
        <emplID>0001</emplID>
        <emplName>Charlie</emplName>
    </Header>
    <Item>
        <ID>123</ID>
        <Location>TX</Location>
    </Item>
    <Item>
        <ID>456</ID>
        <Location>TX</Location>
    </Item>
    <Summary>
        <Total>789</Total>
    </Summary>
</Root>

期望输出

<?xml version="1.0" encoding="UTF-8"?>
<Root>
    <Header>
        <employeeType>FTE</employeeType>
        <emplID>0001</emplID>
        <emplName>Charlie</emplName>
    </Header>
</Root>

当前使用的XSLT及错误结果

所用XSLT

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="Header">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()" />
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

错误输出

<?xml version="1.0" encoding="UTF-8"?>
<Header>
        FTE
        0001
        Charlie
</Header>

错误原因分析

  1. 未处理Root节点:XSLT默认模板会直接遍历并输出匹配到的Header节点,不会保留外层的Root容器。
  2. 缺少身份模板:仅定义Header的复制模板,但未处理其内部子元素,XSLT默认模板会直接输出子元素的文本内容,而非完整的元素标签结构。

正确的XSLT实现

方案一(明确忽略无关节点)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 匹配Root节点,复制自身后仅处理Header子节点 -->
    <xsl:template match="Root">
        <xsl:copy>
            <xsl:apply-templates select="Header"/>
        </xsl:copy>
    </xsl:template>

    <!-- 身份模板:复制所有节点、属性和文本,保留原有结构 -->
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>

    <!-- 直接忽略不需要的Item和Summary节点 -->
    <xsl:template match="Item | Summary"/>
</xsl:stylesheet>

方案二(仅处理目标节点)

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 保留Root容器,仅处理其下的Header节点 -->
    <xsl:template match="Root">
        <xsl:copy>
            <xsl:apply-templates select="Header"/>
        </xsl:copy>
    </xsl:template>

    <!-- 身份模板:完整复制Header及其所有子元素结构 -->
    <xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

方案说明

  • Root节点模板:确保外层Root容器被保留,且仅对其下的Header节点进行处理,其他子节点不会被输出。
  • 身份模板:负责复制所有被选中节点的完整结构(包括元素、属性、文本),保证Header内部的子元素标签不会丢失。
  • 忽略模板(可选):明确指定忽略Item和Summary节点,避免默认模板的潜在影响,逻辑更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:45:02