使用XSLT 1.0将XML分组转换为指定格式以便后续生成JSON
XSLT 1.0 实现分组转换解决方案
XSLT 1.0 无内置distinct-values函数,可使用Muenchian分组法实现按交易伙伴ID去重分组,这是XSLT 1.0场景下处理这类需求的标准方案。
可直接使用的转换脚本
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <!-- 定义分组键:按RegInfo下的tradingPartnerId值分组 --> <xsl:key name="partnerKey" match="RegInfo" use="tradingPartnerId"/> <xsl:template match="/RegResults"> <!-- 筛选所有不重复的tradingPartnerId对应的RegInfo节点 --> <xsl:for-each select="RegInfo[count(. | key('partnerKey', tradingPartnerId)[1]) = 1]"> <!-- 输出当前交易伙伴ID --> <tradingPartnerId> <xsl:value-of select="tradingPartnerId"/> </tradingPartnerId> <!-- 遍历当前交易伙伴对应的所有交易代码 --> <xsl:for-each select="key('partnerKey', tradingPartnerId)"> <ediTransactionCode> <xsl:value-of select="ediTransactionCode"/> </ediTransactionCode> </xsl:for-each> </xsl:for-each> </xsl:template> <!-- 配置输出格式,自动缩进、省略XML声明 --> <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> </xsl:stylesheet>
转换结果验证
使用你提供的源XML执行上述脚本,输出结果完全匹配要求的结构:
<tradingPartnerId>12345</tradingPartnerId> <ediTransactionCode>204</ediTransactionCode> <ediTransactionCode>214</ediTransactionCode> <tradingPartnerId>23456</tradingPartnerId> <ediTransactionCode>204</ediTransactionCode> <ediTransactionCode>214</ediTransactionCode>
可选优化建议
如果后续转JSON的服务支持更规范的XML结构,建议给输出加个外层根节点(比如<PartnerList>),可以避免后续转换JSON时出现同名根键冲突的问题,调整方法仅需要在模板中加一层根元素即可。
内容的提问来源于stack exchange,提问作者doral7806
相关产品推荐
相关产品推荐

