将字符串转换为树结构

时间:2015-04-09 20:48:48

标签: xslt

我对xslt(1.0)很新,无论如何我想从一些困难开始....

给定是一个带有字符串值的源XML&#34; 432565&#34; (<Line>432565</Line>

输出应该是XML

<element id="1">4</element>
<element id="2">43</element>
<element id="3">432</element>
<element id="4">4325</element>
<element id="5">43256</element>
<element id="6">432565</element>

目前我是一个递归模板

 <xsl:template match="Line" name="letters">
    <xsl:param name="text" select="."/>
    <xsl:if test="$text != ''">
      <xsl:variable name="letter" select="substring($text, 1, 1)"/>
      <element>
        <xsl:value-of select="$letter"/>
      </element>
      <xsl:call-template name="letters">
        <xsl:with-param name="text" select="substring-after($text, $letter)"/>
      </xsl:call-template>
    </xsl:if>
  </xsl:template>

返回

<element>4</element>
<element>3</element>
<element>2</element>
<element>5</element>
<element>6</element>
<element>5</element>

我觉得解决方案并不遥远,但如上所述,我对xslt来说是一个新手。

2 个答案:

答案 0 :(得分:1)

除了将文本作为参数传递之外,您还可以传入&#34;长度&#34;参数,从1开始,然后每次调用模板时递增1。然后可以使用它来确定要输出的文本字符串的长度。

尝试使用此模板

 <xsl:template match="Line" name="letters">
    <xsl:param name="text" select="."/>
    <xsl:param name="length" select="1"/>
    <xsl:if test="$length &lt;= string-length($text)">
      <xsl:variable name="letter" select="substring($text, 1, $length)"/>
      <element id="{$length}">
        <xsl:value-of select="$letter"/>
      </element>
      <xsl:call-template name="letters">
        <xsl:with-param name="text" select="$text"/>
        <xsl:with-param name="length" select="$length + 1"/>
      </xsl:call-template>
    </xsl:if>
</xsl:template>

请注意在创建id属性时使用Attribute Value Templates

答案 1 :(得分:0)

这样做的简单方法是向后走:

<xsl:template match="Line" name="dwindle">
    <xsl:param name="text" select="."/>
    <xsl:if test="$text">
        <xsl:variable name="length" select="string-length($text)" />
        <xsl:call-template name="dwindle">
            <xsl:with-param name="text" select="substring($text, 1, $length - 1)"/>
        </xsl:call-template>
        <element id="{$length}">
            <xsl:value-of select="$text"/>
        </element>
    </xsl:if>
</xsl:template>