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>
错误原因分析
- 未处理
Root节点:XSLT默认模板会直接遍历并输出匹配到的Header节点,不会保留外层的Root容器。 - 缺少身份模板:仅定义
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
相关产品推荐
相关产品推荐

