能否用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解析处理,但可以通过组合方式实现需求:
- 预处理输入内容
先移除多余的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>
- 编写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
相关产品推荐
相关产品推荐

