使用XSLT 1.0移除XML的HEADER节点失败,求技术协助
问题:使用XSLT 1.0移除XML中的HEADER节点
我尝试使用XSLT 1.0移除输入XML中的HEADER节点,但无法得到预期输出,恳请技术协助。
输入XML
<?xml version="1.0" encoding="UTF-8"?> <HEADER> <CHILD1 BEGIN="1"> <EDI SEGMENT="1"> <FIELD1>EDI</FIELD1> <FIELD2>2</FIELD2> <FIELD3>HEADER</FIELD3> </EDI> </CHILD1> </HEADER>
预期输出(无XML声明及HEADER节点)
<CHILD1 BEGIN="1"> <EDI SEGMENT="1"> <FIELD1>EDI</FIELD1> <FIELD2>2</FIELD2> <FIELD3>HEADER</FIELD3> </EDI> </CHILD1>
我尝试的代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="HEADER"> <CHILD BEGIN="1"> <xsl:copy-of select="."/> </CHILD> </xsl:template> </xsl:stylesheet>
解决方案
以下是符合需求的XSLT 1.0代码:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <!-- 匹配HEADER节点,输出其所有子节点 --> <xsl:template match="HEADER"> <xsl:copy-of select="node()"/> </xsl:template> <!-- 禁用XML声明输出 --> <xsl:output method="xml" omit-xml-declaration="yes"/> <!-- 身份模板:复制所有其他节点和属性 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
代码说明
- 移除XML声明:通过
<xsl:output>的omit-xml-declaration="yes"属性,确保输出不包含XML声明。 - 处理HEADER节点:匹配HEADER节点的模板中,使用
<xsl:copy-of select="node()"/>直接复制HEADER的所有子节点,从而丢弃HEADER本身。 - 保留其他节点结构:身份模板(匹配
@*|node())负责复制所有其他元素、属性和文本内容,保证CHILD1及其子节点的结构和内容完全保留。
原代码问题分析
你之前的代码存在两个关键错误:
- 手动创建了错误的
<CHILD>节点(预期是<CHILD1>),完全偏离需求; - 使用
<xsl:copy-of select="."/>复制了整个HEADER节点,导致输出中仍包含HEADER,无法达到移除的目的。
内容的提问来源于stack exchange,提问作者Padd T
相关产品推荐
相关产品推荐

