Файл XSLT с разделением запятыми - PullRequest
1 голос
/ 26 марта 2012

У меня есть некоторые данные в элементе 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?

1 Ответ

0 голосов
/ 26 марта 2012

Используя 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...