如何使用XSLT从输入XML中分割逗号分隔数据

时间:2014-12-12 16:16:10

标签: xslt xslt-1.0

我有如下输入:

<Record>
<OldList>,Old1,Old2,Old3</OldList>
<NewList>,New1,New2,New3</NewList>
<Record>

我的输出操作系统XSLT转换如下所示:

<Records>
  <Record>
    <Old>Old1</Old>
    <New>New1</New>
  </Record>
  <Record>
     <Old>Old2</Old>
     <New>New2</New>
  </Record>
  <Record>
     <Old>Old3</Old>
     <New>New3</New>
   </record>
</Records>

你能帮助我得到上面想要的输出吗?我正在使用XSLT 1.0

1 个答案:

答案 0 :(得分:0)

尝试以下xslt

  <xsl:template match="/*">
    <Records>
      <xsl:call-template name="oldData">
        <xsl:with-param name="oData" select="OldList"/>
        <xsl:with-param name="nData" select="NewList"/>
      </xsl:call-template>
    </Records>
  </xsl:template>
  <xsl:template name="oldData">
    <xsl:param name="oData"/>
    <xsl:param name="nData"/>
    <xsl:variable name="ofirst" select="substring-before($oData,',')"/>
    <xsl:variable name="olast" select="substring-after($oData,',')"/>
    <xsl:variable name="nfirst" select="substring-before($nData,',')"/>
    <xsl:variable name="nlast" select="substring-after($nData,',')"/>
    <xsl:choose>
      <xsl:when test="($ofirst!='') and ($nfirst!='')">
        <record>
          <Old>
            <xsl:value-of select="$ofirst"/>
          </Old>
          <New>
            <xsl:value-of select="$nfirst"/>
          </New>
        </record>
        <xsl:call-template name="oldData">
          <xsl:with-param name="oData" select="substring-after($oData,concat($ofirst,','))"/>
          <xsl:with-param name="nData" select="substring-after($nData,concat($nfirst,','))"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:when test="$olast!='' and $nlast!=''">
        <xsl:call-template name="oldData">
          <xsl:with-param name="oData" select="$olast"/>
          <xsl:with-param name="nData" select="$nlast"/>
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <record>
          <Old>
            <xsl:value-of select="$oData"/>
          </Old>
          <New>
            <xsl:value-of select="$nData"/>
          </New>
        </record>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

在XSLT 1.0中创建可变变量不是一种选择。然而,这可以通过递归来实现。这就是问题如何解决