- PR -

XMLとXSLでの改行

1
投稿者投稿内容
ひろ
会議室デビュー日: 2005/03/08
投稿数: 13
お住まい・勤務地: 京都
投稿日時: 2005-03-08 13:24
初めまして。
@ITでの書き込み方でで駄目な部分も有りますが、
治していくので許してください。

今回は壁にぶつかったので質問します。

■質問■
ASP.NETでXMLを呼び出そうとしています。
ツリー型掲示板(仮)を作っています。
しかし・・・記事の改行がうまくできません。

↓XML↓
<?xml version='1.0'?>
<?xml-stylesheet type="text/xsl" href="CommentTree.xslt"?>
<IssueComment>
<Comment>
<EntryName>Aさん</EntryName>
<EntryDate>2005/06/04</EntryDate>
<Title>1・2・3・ヒャー!!</Title>
<RenewName></RenewName>
<RenewDate></RenewDate>
</Comment>
<Comment>
<EntryName>Bさん</EntryName>
<EntryDate>2005/06/07</EntryDate>
<Title>└猪木のパくり?<BR />そうだよねぇ?</Title>
<RenewName></RenewName>
<RenewDate></RenewDate>
</Comment>
<Comment>
<EntryName>Cさん</EntryName>
<EntryDate>2005/06/03</EntryDate>
<Title>1・2・3 ダー!!</Title>
<RenewName></RenewName>
<RenewDate></RenewDate>
</Comment>
<Comment>
<EntryName>Cさん</EntryName>
<EntryDate>2005/06/05</EntryDate>
<Title>└猪木だよ(σ〃'ω')σYO</Title>
<RenewName></RenewName>
<RenewDate></RenewDate>
</Comment>
<Comment>
<EntryName>Eさん</EntryName>
<EntryDate>2005/06/04</EntryDate>
<Title>└猪木かよ!</Title>
<RenewName></RenewName>
<RenewDate></RenewDate>
</Comment>
</IssueComment>

↓XSLT↓
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="IssueComment">
<table width="100%">
<xsl:for-each select="Comment">
<tr>
<td width="60%"><font style="font-size:x-small">
<xsl:value-of select="Title"/>
</font>
</td>
<td width="10%"><font style="font-size:x-small">
<xsl:value-of select="EntryName"/>
</font>
</td>
<td width="10%"><font style="font-size:x-small">
<xsl:value-of select="EntryDate"/>
</font>
</td>
<td width="10%"><font style="font-size:x-small">
<xsl:value-of select="RenewUser"/>
</font>
</td>
<td width="10%"><font style="font-size:x-small">
<xsl:value-of select="RenewDate"/>
</font>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>

たしか改行は<BR />で良かったと思うのですが・・・。
XML初心者なのでXMLのタグに悩まされています。

作業的には・・・
ASP.NETからSQLServerにアクセスし、
ASP.NETからXMLファイルを更新。
その後XMLを読み出しています。

一応なんちゃってツリーまでは出せているのですが、
改行されません。
どうすれば改行できるか分かる方おられないでしょうか。

XML初心者なのでできるだけ分かりやすくお願いします。

[ メッセージ編集済み 編集者: ひろ 編集日時 2005-03-09 10:01 ]
Vacant-Eyes
ベテラン
会議室デビュー日: 2004/08/15
投稿数: 97
投稿日時: 2005-03-08 23:54
原因はXSLTプロセッサが「<br/>」をHTMLの改行ではなく、
単に名前が「br」であるタグだと認識するためです。
この場合、
<Title>└猪木のパくり?<BR />そうだよねぇ?</Title>
のTitle要素は、

@「└猪木のパくり?」という値を持つテキストノード、
A「BR」という名前の空要素(値を持たない要素)
B「そうだよねぇ?」という値を持つテキストノード
の3つの子ノードを持つことになります。

ですので、<xsl:value-of select="Title">の出力は
@+A+B→└猪木のパくり?そうだよねぇ?
となってしまいます。

そこで、解決方法として
<Title>└猪木のパくり?<BR />そうだよねぇ?</Title>

<Title>└猪木のパくり?&lt;BR /&gt;そうだよねぇ?</Title>
のように文字参照として記述し、XSLT内で
<xsl:value-of select="Title" disable-output-escaping="yes"/>
のように書くとうまく改行できます。
disable-output-escaping属性をyesにすると、
文字参照が表す文字がそのまま出力されます。(デフォルトはno)

あと、SQL Serverに掲示板の投稿内容を保存してあるのであれば、
XMLに整形する必要はないような気が・・・
それと、XSLTもとても有用ですが、.NETでDOMっぽいこともできるので、
一度試してみてはいかがでしょうか?
Atsushi.Eno
ベテラン
会議室デビュー日: 2003/04/23
投稿数: 60
投稿日時: 2005-03-09 00:43
xsl:value-of 命令は、ノードの文字列値を出力するもので、要素ノードの文字列値はすべての 子孫テキストノードの文字列値をドキュメント順に連結したものです。

<xsl:copy-of select="Title/node()" /> を使えば、Titleの内容をそのままタグ付きで出力することができると思います。
ひろ
会議室デビュー日: 2005/03/08
投稿数: 13
お住まい・勤務地: 京都
投稿日時: 2005-03-09 11:14
Vacant-EyesさんAtsushi.Enoさんありがとうございました。

親切な書き込みで解決することができました。

>あと、SQL Serverに掲示板の投稿内容を保存してあるのであれば、
>XMLに整形する必要はないような気が・・・
>それと、XSLTもとても有用ですが、.NETでDOMっぽいこともできるので、
>一度試してみてはいかがでしょうか?
と有りましたが、ASP.NET+SQLServer+SML+XSLTを触るのが初めてなので、
今しているプロジェクトが終わり次第勉強しようと思います。

本当にありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)