首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >XSLT 1.0 :遍历字符串中的字符

XSLT 1.0 :遍历字符串中的字符
EN

Stack Overflow用户
提问于 2010-05-06 22:36:08
回答 2查看 10.9K关注 0票数 16

我需要遍历字符串中的字符以构建XML结构。

目前,我正在做这件事:

代码语言:javascript
复制
<xsl:template name="verticalize">
    <xsl:param name="text">Some text</xsl:param>
    <xsl:for-each select="tokenize(replace(replace($text,'(.)','$1\\n'),'\\n$',''),'\\n')">
        <xsl:element name="para">
            <xsl:value-of select="."/>
        </xsl:element>
    </xsl:for-each>
</xsl:template>

这会产生类似如下的结果:

代码语言:javascript
复制
<para>S</para>
<para>o</para>
<para>m</para>
<para>e</para>
<para> </para>
<para>t</para>
<para>e</para>
<para>x</para>
<para>t</para>

这在XPath2.0中工作得很好。但我需要在replace()方法不可用的XPath 1.0环境中应用相同的处理方法。

你知道有什么方法可以做到这一点吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-06 22:42:48

代码语言:javascript
复制
<xsl:template name="letters">
  <xsl:param name="text" select="'Some text'" />
  <xsl:if test="$text != ''">
    <xsl:variable name="letter" select="substring($text, 1, 1)" />
    <para><xsl:value-of select="$letter" /></para>
    <xsl:call-template name="letters">
      <xsl:with-param name="text" select="substring-after($text, $letter)" />
    </xsl:call-template>
  </xsl:if>
</xsl:template>
票数 18
EN

Stack Overflow用户

发布于 2010-05-06 22:39:40

如果字符串长度不是很长,可以使用递归调用template来实现,将要处理的字符的索引作为参数传递到模板中。

如下所示:

代码语言:javascript
复制
<xsl:template name="verticalize">
    <xsl:param name="text">Some text</xsl:param>
    <xsl:param name="index" select="1" />
    <xsl:if test="string-length($text) &gt;= $index">
        <xsl:element name="para">
            <xsl:value-of select="substring($text, $index, 1)"/>
        </xsl:element>
        <xsl:call-template name="verticalize">
            <xsl:with-param name="text" select="$text" />
            <xsl:with-param name="index" select="$index+1" />
        </xsl:call-template>
    </xsl:if>
</xsl:template>

如果字符串比这个长度长,您可以使用类似的方法,但使用分而治之的算法,以便获得最大递归深度log2( string -length),如下所示:

代码语言:javascript
复制
<xsl:template name="verticalize">
    <xsl:param name="text">Some text</xsl:param>
    <xsl:param name="left" select="1" />
    <xsl:param name="right" select="string-length($text)" />
    <xsl:choose>
        <xsl:when test="$left = $right">
            <xsl:element name="para">
                <xsl:value-of select="substring($text, $left, 1)"/>
            </xsl:element>
        </xsl:when>
        <xsl:when test="$left &lt; $right">
            <xsl:variable name="middle" select="floor(($left+$right) div 2)" />
            <xsl:call-template name="verticalize">
                <xsl:with-param name="text" select="$text" />
                <xsl:with-param name="left" select="$left" />
                <xsl:with-param name="right" select="$middle" />
            </xsl:call-template>
            <xsl:call-template name="verticalize">
                <xsl:with-param name="text" select="$text" />
                <xsl:with-param name="left" select="$middle+1" />
                <xsl:with-param name="right" select="$right" />
            </xsl:call-template>
        </xsl:when>
    </xsl:choose>
</xsl:template>
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2781892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档