从SQL返回的逗号分隔数据的XSLT转换

时间:2017-11-15 15:35:28

标签: xml xslt xslt-1.0

我使用XSLT 1.0从SQL返回信息:

<xsl:if test="../Field[@Name='TheDBFieldName'][.!='']">
    <xsl:element namespace="http://BlahBlah" name="TheResult">
        <xsl:value-of select="../Field[@Name='TheDbFieldName']" />
    </xsl:element>
</xsl:if>

我的当前结果如下所示:

1,2,3,6-

我需要像这样返回:

<TheDBFieldName>
    <TheResult>
        <Result>1</Result>
    </TheResult>
    <TheResult>
        <Result>2</Result>
    </TheResult>
    <TheResult>
        <Result>3</Result>
    </TheResult>
    <TheResult>
        <Result>6</Result>
    </TheResult>
</TheDBFieldName>

不幸的是XSLT 2.0不是我的选择

对此有任何帮助,包括使用我的信息的例子,我们将不胜感激!我一直无法将当前示例应用于我的示例,主要是因为我使用SQL数据而不是吸收XML文件

1 个答案:

答案 0 :(得分:0)

您可以在递归模板调用中使用substring-before()substring-after()

示例...

XML输入

<Field Name="TheDBFieldName">1,2,3,6</Field>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="Field">
    <xsl:element name="{@Name}">
      <xsl:call-template name="tokenize">
        <xsl:with-param name="input" select="."/>
      </xsl:call-template>
    </xsl:element>
  </xsl:template>

  <xsl:template name="tokenize">
    <xsl:param name="input"/>
    <xsl:variable name="remaining" select="substring-after($input,',')"/>
    <TheResult>
      <Result>
        <xsl:value-of select="normalize-space(substring-before(concat($input,','),','))"/>
      </Result>
    </TheResult>
    <xsl:if test="$remaining">
      <xsl:call-template name="tokenize">
        <xsl:with-param name="input" select="$remaining"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>

</xsl:stylesheet>

<强>输出

<TheDBFieldName>
   <TheResult>
      <Result>1</Result>
   </TheResult>
   <TheResult>
      <Result>2</Result>
   </TheResult>
   <TheResult>
      <Result>3</Result>
   </TheResult>
   <TheResult>
      <Result>6</Result>
   </TheResult>
</TheDBFieldName>

要适应您的样式表,请添加tokenize模板并更改:

<xsl:value-of select="../Field[@Name='TheDbFieldName']" />

为:

<xsl:call-template name="tokenize">
  <xsl:with-param name="input" select="../Field[@Name='TheDbFieldName']"/>
</xsl:call-template>