textareaデータの表示について

「まったく何も分からない・・・」そんなユーザーさんの為のフォーラムです。どんなご質問でもお気軽にどうぞ。
返信
ifeel
パワーユーザー
記事: 32
登録日時: 2006年9月28日(木) 19:40

textareaデータの表示について

投稿記事 by ifeel » 2006年12月14日(木) 15:23

こんにちは。いつもお世話になっております :D

今回の質問はもしかしたら要望になるかもしれないのですが
実は簡単にできることかもしれないのでこちらに投稿させていただきます。

やりたいことは
textareaに入力したデータを
リストタグをつけて表示する
ということです。

例えば、プロフィールを登録するコンテンツがあったとして
趣味の欄に
「スキー
英会話
読書」
のように、改行をしながら入力すると
通常は、outputの選択によって、<br>が入ったりして
そのまま表示されますが、これを、改行が入っていたら

・スキー
・英会話
・読書

と言うように、リストとして表示される、というものです。
入力する行数が固定ならdataの数を相当数用意すればよいのですが
エントリ毎に数が違うので・・・。

「・」を自分で入れれば良い話なのですが
もしも良い方法があればアドバイスお願いいたします!

miya
パワーユーザー
記事: 85
登録日時: 2006年3月25日(土) 09:20
お住まい: 東京都

Re: textareaデータの表示について

投稿記事 by miya » 2006年12月14日(木) 17:07

ifeelさん、こんにちは。

スキーマ定義でtextareaのoutput属性をhtml2にした場合、デザイン定義を
このようにすれば、いけるかもしれません。
(試した訳ではないのですが…  :)  )

コード: 全て選択


<ul>
  <li><xsl:value-of select="translate(syumi, '<br />', '</li>&#x0a;  <li>')" /></li>
</ul>


※「&#x0a;」は改行コード

<br />を、</li>+改行コード+<li>に変換できるのではないかと。。。

こちらを参考にしました

http://www6.airnet.ne.jp/manyo/xml/index.html

ifeel
パワーユーザー
記事: 32
登録日時: 2006年9月28日(木) 19:40

投稿記事 by ifeel » 2006年12月14日(木) 19:17

miyaさん

こんにちは。
早速アドバイスありがとうございます!

教えていただいた方法を試したところエラーがでてしまったので
< を &lt; などに変更してみたら、ソース上で

あああああ</li>

のようなりました。
つまり<br />が</li>になるところまではOKなのですが
<li>が表示されないのです。

ためしに改行コードを削除して

コード: 全て選択

<ul>
<li>
<xsl:value-of select="translate(syumi, '<br />', '</li><li>')" disable-output-escaping="yes" /></li>
</ul>
としてみても

コード: 全て選択

<ul>
        <li>あああああ<li> <
あああああああ<li> <
あああああああ
</li>
      </ul>
という感じで、<li>タグが出てきてくれません。
<だけが出てくる辺り、何か書き換わってしまってるようにも
思うのですが、謎めいています・・・。

教えていただいたサイトから、他の関数を見たりしているのですが
あと一歩のまま :oops:
やっぱり難しいですね。

でも、もうちょっとがんばってみます。

miya
パワーユーザー
記事: 85
登録日時: 2006年3月25日(土) 09:20
お住まい: 東京都

難しいですね…

投稿記事 by miya » 2006年12月15日(金) 12:25

ifeelさん

こんにちは。
私も試してみたら、同じ状況でした…
お恥ずかしい :oops:

translate(syumi, '変換前', '変換後')

は、変換前の文字数と、変換後の文字数が同じじゃないといけないようですね。

<br />を</li><li>に変換しようとすると


<br />   ←6文字
 ↓
</li><   ←6文字


になるようです。

textareaじゃなくてlistを使えば良いのでしょうけど…

お役に立てなくてすみません :(

ifeel
パワーユーザー
記事: 32
登録日時: 2006年9月28日(木) 19:40

なるほど!

投稿記事 by ifeel » 2006年12月15日(金) 14:42

miyaさん

文字数が同じでないといけないのですね!
そんなことにも気がつきませんでしたっ。

ありがとうございます。

せっかくなのでもう少し関数(と言うのでしょうか?)を試してみて
ご報告したいなと思います。
だめそうですが^^;

webmaster
Site Admin
記事: 1451
登録日時: 2004年12月10日(金) 10:09

Re: 難しいですね…

投稿記事 by webmaster » 2006年12月15日(金) 14:47

 ifeelさん、いつもご質問ありがとうございます。

 このご要望(文字列の置換処理)は、XSLT的に非常に苦手な分野の為、一般的に
実現困難かと思われます。

 XSLTのtranslate関数は、「文字列」ではなく「文字」を置換する為のもので、
例えばアルファベットの大文字を全て小文字に変換したい、というようなかなり特殊な
用途にしか使えません。
 translate( data, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqurstvwxyz' )
 のように書くと、"My Documents"という文字列が"my documents"になる、
というような使い方です。

 XSLTで文字列の置換を行う場合には、再帰処理という複雑なテクニックを用いる
事になります。
 substring-beforeとsubstring-afterという関数があり、これらは指定した文字列が
元データ中に含まれていた場合に、それより「以前」や「以降」の文字列を取り出して返す
というものです。

 考え方としては、substring-beforeで「最初に見つけた改行より前の文字列」を見つけて
<li></li>で囲んで出力し、残りを再度自分自身のテンプレートへ渡す、というテンプレート
を書くことになります。改行がなくなったら再帰を終了します。

 少し興味がありましたので、サンプルを作成してみました。もしよろしければご利用下さい。

 以下のソースを、<xsl:template match=...> と同レベルに置いて下さい。
 </xsl:stylesheet>の直前でOKです。

コード: 全て選択

<!-- 1行ずつli要素変換するテンプレート -->
<xsl:template name="autolisting">
	<xsl:param name="text" />
	
	<!-- 文字列が改行を含まない場合は全体をli要素で囲んで出力し、終了。 -->
	<xsl:if test="not(contains( $text, '&#x0A;' ))">
		<li><xsl:value-of select="$text" /></li>
	</xsl:if>
	
	<!-- 文字列が改行を含む場合は、改行より前の文字列をli要素に変換し、残りは再帰させる。 -->
	<xsl:if test="contains( $text, '&#x0A;')">
		<li><xsl:value-of select="substring-before( $text, '&#x0A;')" /></li>
		<xsl:call-template name="autolisting">
			<xsl:with-param name="text" select="substring-after( $text, '&#x0A;' )" />
		</xsl:call-template>
	</xsl:if>
	
</xsl:template>
 呼び出し側では、通常、

コード: 全て選択

<xsl:value-of select="item1" />
 のようになっているところを、

コード: 全て選択

<xsl:call-template name="autolisting">
	<xsl:with-param name="text" select="item1" />
</xsl:call-template>
 のように変えて下さい。

ifeel
パワーユーザー
記事: 32
登録日時: 2006年9月28日(木) 19:40

ありがとうございました!!

投稿記事 by ifeel » 2006年12月15日(金) 15:18

webmaster様

いつもご面倒おかけして申し訳ありません。
今回のは特に、直接CMSDに関係のない内容でお手数お掛けしました。

おかげさまでリストタグが出てきました。
スキーマのoutputをtext2にしていたので
最初は<br />が出てしまったのですが
html1にしたら問題なく表示されました。
本当にありがとうございます!

今後も活躍する機能になりそうです :D

関数と言うと、Excelの関数のイメージがあったので
テキストを置換する関数くらいあるだろう、と思っていたのですが
「文字列関数」というのを見てみたら、数が少なくて
もしや不可能なの??
というところまで来たところでした・・・。xsltが苦手な分野なのですね。

でも、それを調べた成果で、webmaster様のコードが
雰囲気だけでも分かりました!
(もちろん自分じゃ書けませんが)

重ねて、ありがとうございました。

返信