XSL实现元素拆分:将XML中ORDER的DETAILS拆分为多子元素
XSLT解决方案:拆分ORDER的DETAILS元素
这里有一个XSLT 1.0的实现方案,完美匹配你的需求——它会完整保留原XML的所有结构,仅对DAILY_LOAD/ORDERS/ORDER节点做修改:移除DETAILS元素,将其分号分隔的内容拆分为ORDER_NO、CUSTOMER、NO_OF_ITEMS、TOTAL、LOCATION五个子元素。
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <!-- 身份模板:复制所有未被特殊匹配的节点、属性和文本 --> <xsl:template match="@*|node()"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> <!-- 专门处理ORDER节点 --> <xsl:template match="ORDER"> <xsl:copy> <!-- 复制ORDER下除DETAILS外的所有子节点 --> <xsl:apply-templates select="node()[not(self::DETAILS)]"/> <!-- 拆分DETAILS的分号分隔内容,生成对应子元素 --> <xsl:variable name="details" select="DETAILS/text()"/> <ORDER_NO><xsl:value-of select="substring-before($details, ';')"/></ORDER_NO> <xsl:variable name="rest1" select="substring-after($details, ';')"/> <CUSTOMER><xsl:value-of select="substring-before($rest1, ';')"/></CUSTOMER> <xsl:variable name="rest2" select="substring-after($rest1, ';')"/> <NO_OF_ITEMS><xsl:value-of select="substring-before($rest2, ';')"/></NO_OF_ITEMS> <xsl:variable name="rest3" select="substring-after($rest2, ';')"/> <TOTAL><xsl:value-of select="substring-before($rest3, ';')"/></TOTAL> <LOCATION><xsl:value-of select="substring-after($rest3, ';')"/></LOCATION> </xsl:copy> </xsl:template> </xsl:stylesheet>
关键说明:
- 身份模板:这是XSLT里的基础模板,负责原样复制XML中所有没有被特殊模板匹配的内容,保证原文档的结构(比如
MESSAGE_ID、HEADERS、TRAILER等)完全不变。 - ORDER节点处理:
- 先复制ORDER节点下除
DETAILS外的所有子元素(比如ITEM、EMP_NO等)。 - 通过
substring-before和substring-after函数逐层拆分DETAILS的分号分隔文本,依次提取出五个字段的值,生成对应的子元素。
- 先复制ORDER节点下除
这个方案经过验证,转换后的XML会完全符合你给出的期望格式,同时保留原文档的所有其他结构和属性(包括xsi:nil这类命名空间属性)。
内容的提问来源于stack exchange,提问作者Manulak
相关产品推荐
相关产品推荐

