You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求XSLT 1.0转换代码:将含重复item段与逗号分隔GTIN的XML转换为指定Asset结构

实现指定XML结构转换的XSLT 1.0解决方案

需求说明

输入XML(含重复item段):

<root type="array"> 
  <item type="object"> 
    <metadata type="object"> 
      <GTIN type="string">abcd,efwe,sdsf</GTIN> 
    </metadata> 
  </item> 
  <item type="object"> 
    <metadata type="object"> 
      <GTIN type="string">xxx,yyy,zzz</GTIN> 
    </metadata> 
  </item> 
</root>

预期输出XML:

<Assets> 
  <Asset ID="X.test" UserTypeID="XAsset"> 
    <Values> 
      <MultiValue AttributeID="GTINList"/> 
      <value>abcd</value> 
      <value>efwe</value> 
      <value>sdsf</value> 
    </Values> 
  </Asset> 
  <Asset ID="X.test" UserTypeID="XAsset"> 
    <Values> 
      <MultiValue AttributeID="GTINList"/> 
      <value>xxx</value> 
      <value>yyy</value> 
      <value>zzz</value> 
    </Values> 
  </Asset> 
</Assets>

用户尝试嵌套递归模板未得到预期结果,寻求正确的XSLT 1.0转换代码。


解决方案代码

下面是能精准实现需求的XSLT 1.0代码:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <!-- 匹配根节点,生成外层Assets容器 -->
  <xsl:template match="/root">
    <Assets>
      <xsl:apply-templates select="item"/>
    </Assets>
  </xsl:template>

  <!-- 处理每个item,生成对应的Asset结构 -->
  <xsl:template match="item">
    <Asset ID="X.test" UserTypeID="XAsset">
      <Values>
        <MultiValue AttributeID="GTINList"/>
        <!-- 调用递归模板拆分GTIN的逗号分隔值 -->
        <xsl:call-template name="split-gtin">
          <xsl:with-param name="gtin-string" select="metadata/GTIN"/>
        </xsl:call-template>
      </Values>
    </Asset>
  </xsl:template>

  <!-- 递归拆分逗号分隔的GTIN字符串,生成单个value元素 -->
  <xsl:template name="split-gtin">
    <xsl:param name="gtin-string"/>
    <xsl:choose>
      <!-- 存在逗号时,拆分第一个值并递归处理剩余部分 -->
      <xsl:when test="contains($gtin-string, ',')">
        <value>
          <xsl:value-of select="substring-before($gtin-string, ',')"/>
        </value>
        <xsl:call-template name="split-gtin">
          <xsl:with-param name="gtin-string" select="substring-after($gtin-string, ',')"/>
        </xsl:call-template>
      </xsl:when>
      <!-- 处理最后一个无逗号的GTIN值 -->
      <xsl:otherwise>
        <value>
          <xsl:value-of select="$gtin-string"/>
        </value>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <!-- 抑制默认输出,避免原XML的多余文本/属性被输出 -->
  <xsl:template match="text()|@*"/>
</xsl:stylesheet>

代码逻辑解释

  • 根节点处理:匹配<root>后生成<Assets>,并遍历所有<item>节点进行转换。
  • item节点转换:每个<item>对应生成固定属性的<Asset>,在<Values>中先输出<MultiValue>,再调用递归模板处理GTIN多值。
  • 递归拆分模板:核心逻辑是通过substring-before和substring-after拆分逗号分隔的字符串,递归生成每个<value>元素,直到处理完所有值。
  • 默认模板抑制:最后一个空模板避免原XML中的type属性、空白文本等无关内容被输出,保证结果纯净。

你可以将这段代码放入XSLT 1.0兼容的处理器中运行,即可得到预期的输出结构。

内容的提问来源于stack exchange,提问作者Santanu Singha Roy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 23:14:05