如何使用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
相关产品推荐
相关产品推荐

