3

私はこの投稿から取ったxslにこの関数を持っています

「cr」を「改行」に置き換える

これは私がそれを呼び出す方法です:

<xsl:variable name="breakText">
     <xsl:call-template name="insertBreaks"> 
          <xsl:with-param name="subject" select="PublicProfile/AboutMe"/> 
         </xsl:call-template>
    </xsl:variable>

テキストの「続きを読む」への記事リンクのように、記事の短い開始の最初のdiv(長い記事の550文字)をクリックして、「insertBreaks」機能を使用しなかったようにテキストを表示します

<xsl:copy-of select="substring($breakText,0,550)"/>

しかし、長い説明のこの行は正常に機能しています:

<xsl:copy-of select="$breakText"/>

どこが間違っていたのですか?

4

2 に答える 2

2

使用したくxsl:value-ofないxsl:copy-of. xsl:copy-of選択したタグの要素とそのすべての値を返します。xsl:value-of選択したタグに関連付けられたテキストを返します。部分文字列を取得しようとしているので、テキストが必要です。

于 2012-04-16T09:53:15.757 に答える
0

質問で言及されている解決策は、たまたま私のものです。

改行文字を「改行」ではなく要素<br /> 置き換えます。要素はノードであり、文字列ではありません。

したがって、$breakTextこの質問で定義されている は一時ツリー (XSLT 2.0) または XSLT 1.0 の RTF (結果ツリー フラグメント) であり、文字列ではありません

問題は次のとおりです (ゼロをインデックスとして使用するという付随する小さなエラーに関係なく):

substring($breakText,0,550)

は文字列 ( の文字列値から計算) であるため、要素やノードを$breakText含めることはできません。<br/>

注意: 要素またはツリーの文字列値は、そのすべてのテキスト ノードの子孫の値を連結したものです。

反対側

<xsl:copy-of select="$breakText"/> 

一時ツリーを (XSLT 2.0 で) コピーするか、RTF のシリアル化を生成します (XSLT 1.0 で)。

より簡単に言えば、構造をxsl:copy-of 保持string()するか、文字列への変換は文字列だけを生成し、文字列には構造がありません (すべてのノードがなくなります)。

于 2012-04-16T12:19:40.213 に答える