我在XML元素中有一些数据如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<payload>
<set>
<month>JAN,FEB,MAR</month>
<season>Season1</season>
<productId>ABCD</productId>
</set>
</payload>
我感兴趣的是将逗号分隔的字符串拆分为全新的集合标记,如:
<payload>
<set>
<month>JAN</month>
<season>Season1</season>
<productId>ABCD</productId>
</set>
</payload>
<payload>
<set>
<month>FEB</month>
<season>Season1</season>
<productId>ABCD</productId>
</set>
</payload>
<payload>
<set>
<month>MAR</month>
<season>Season1</season>
<productId>ABCD</productId>
</set>
</payload>
如何使用XSLT执行此操作?
答案 0 :(得分:0)
使用XSLT 1.0,您必须使用对命名模板的递归调用来拆分字符串,这是一个可能的解决方案:
<xsl:stylesheet
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:param name="month"/>
<xsl:copy>
<xsl:apply-templates select="@* | node()">
<xsl:with-param name="month" select="$month"/>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="month">
<xsl:param name="month"/>
<month>
<xsl:choose>
<xsl:when test="$month">
<xsl:value-of select="$month"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates/>
</xsl:otherwise>
</xsl:choose>
</month>
</xsl:template>
<xsl:template name="splitMonths">
<xsl:param name="months"/>
<xsl:variable name="firstMonth" select="substring-before($months,',')"/>
<xsl:variable name="month">
<xsl:choose>
<xsl:when test="$firstMonth">
<xsl:value-of select="$firstMonth"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$months"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="otherMonths" select="substring-after($months,',')"/>
<xsl:if test="$month">
<payload>
<xsl:apply-templates>
<xsl:with-param name="month" select="$month"/>
</xsl:apply-templates>
</payload>
</xsl:if>
<xsl:if test="$otherMonths">
<xsl:call-template name="splitMonths">
<xsl:with-param name="months" select="$otherMonths"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template match="payload">
<xsl:call-template name="splitMonths">
<xsl:with-param name="months" select="set/month"/>
</xsl:call-template>
</xsl:template>
</xsl:stylesheet>