2011-01-12 14 views
3

ゼロ幅の文字を追加する関数があります。それは私がそれにしたいと思うようにかなり働いていない。ゼロスペース文字を15文字ごとに追加するにはどうすればいいですか?通常のスペースが含まれていない場合はどうすればよいですか?XSLT:条件付きでサブストリングの変更を追加します。

<xsl:template match="text()[parent::d:entry]"> 
    <xsl:call-template name="intersperse-with-zero-spaces"> 
     <xsl:with-param name="str" select="."/> 
     <xsl:with-param name="max_length" select="number(15)"/> 
    </xsl:call-template> 
</xsl:template> 
<xsl:template name="intersperse-with-zero-spaces"> 
     <xsl:param name="str"/> 
     <xsl:param name="max_length"/> 
     <xsl:variable name="ret"> 
      <xsl:value-of select="substring($str, 1, $max_length)"/> 
      <xsl:if test="string-length($str) &gt; $max_length"> 
       <xsl:value-of select="'&#x200b;'"/> 
       <xsl:call-template name="intersperse-with-zero-spaces"> 
        <xsl:with-param name="str" select="substring($str, $max_length + 1)"/> 
        <xsl:with-param name="max_length" select="$max_length"/> 
       </xsl:call-template> 
      </xsl:if> 
     </xsl:variable> 
     <xsl:value-of select="$ret"/> 
    </xsl:template> 

答えて

3

いくつかのヒント。まず第一に:

<xsl:template match="d:entry/text()"> 

その後、

<xsl:template match="text()[parent::d:entry]"> 

よりも優れていると:

<xsl:template name="intersperse-with-zero-spaces"> 
    <xsl:param name="str"/> 
    <xsl:param name="max_length"/> 

    <!-- your variable "ret" is not necessary at all --> 

    <xsl:variable name="head" select="substring($str, 1, $max_length)" /> 
    <xsl:variable name="tail" select="substring($str, $max_length + 1)" /> 

    <xsl:value-of select="$head"/> 

    <!-- the empty string evaluates to false --> 
    <xsl:if test="$tail"> 
    <!-- there's no space present when translate() returns the same string 
     and the $tail does not begin with a space, either --> 
    <xsl:if test=" 
     string-length(translate($head, ' ', '')) = string-length($head) 
     and not(substring($tail, 1, 1) = ' ') 
    "> 
     <xsl:text>&#x200b;</xsl:text> 
    </xsl:if> 
    <xsl:call-template name="intersperse-with-zero-spaces"> 
     <xsl:with-param name="str"  select="$tail"/> 
     <xsl:with-param name="max_length" select="$max_length"/> 
    </xsl:call-template> 
    </xsl:if> 
</xsl:template> 

また、私はおそらく変数$interval、ない$max_lengthを呼びたいです。しかしそれは純粋に化粧です。

+0

@Tomalak:まあまあです。サブストリング間のスペースのみをチェックします。部分文字列に**任意の**空白文字が含まれているとゼロスペース文字を追加したくない – Ace

+0

@Ace:私はそのような質問を理解しませんでした。しかし、それは簡単です。 'string-length($ str)'と 'string-length(translate($ str、 ''、 ''))を比較してください。それらが等しい場合、 '$ str'は空白を含みません。 – Tomalak

+0

@Tomalak:問題はありません。質問を更新してより明確にする、あなたの答えを更新することはできますか? – Ace

関連する問題