寻求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
相关产品推荐
相关产品推荐

