使用XSLT自定义拆分XML的技术问询(映射工具场景)
XSLT实现XML Response元素拆分方案
首先看你提供的XML结构,里面在<multimap:Message1>下有<Response>(包含<Employment>)和<Responses>(包含<Term>)节点,我们的目标是把每个带<status>的业务元素(Employment、Term)都独立拆分出来,同时保留原有的命名空间和基础结构。
这里给你写一个针对性的XSLT样式表:
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:multimap="http://google.com/z/Z/SplitAndMerge"> <xsl:output method="xml" indent="yes" encoding="UTF-8"/> <!-- 匹配根节点,生成外层容器结构 --> <xsl:template match="/multimap:Messages"> <multimap:Messages> <!-- 遍历所有包含status子节点的业务元素 --> <xsl:apply-templates select=".//*[status]"/> </multimap:Messages> </xsl:template> <!-- 处理每个独立的业务元素,生成拆分后的消息节点 --> <xsl:template match="*[status]"> <multimap:Message> <!-- 保留原元素的父容器(Response/Responses)结构 --> <xsl:element name="{name(..)}"> <xsl:copy-of select="."/> </xsl:element> </multimap:Message> </xsl:template> </xsl:stylesheet>
关键逻辑说明:
- 先声明与原XML一致的
multimap命名空间,避免转换后命名空间丢失 - 根节点模板负责生成外层的
<multimap:Messages>容器,通过//*[status]精准定位所有带状态节点的业务元素 - 业务元素模板为每个匹配到的元素创建独立的
<multimap:Message>节点,同时完整保留它原来的父容器结构(Response或Responses)
转换后的输出效果:
<?xml version="1.0" encoding="UTF-8"?> <multimap:Messages xmlns:multimap="http://google.com/z/Z/SplitAndMerge"> <multimap:Message> <Response> <Employment> <status>OK</status> </Employment> </Response> </multimap:Message> <multimap:Message> <Responses> <Term> <status>OK</status> </Term> </Responses> </multimap:Message> </multimap:Messages>
这样每个Response相关的业务元素都被拆分成了独立的消息节点,完全满足自定义拆分的需求。
内容的提问来源于stack exchange,提问作者Shaibayan Chakrabarti
相关产品推荐
相关产品推荐

