- - PR -
XSLTでの並べ替えが上手くいかない
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2004-03-25 00:37
はじめまして。最近XMLを勉強しています。
現在XMLを使用した掲示板を作成しています。投稿データをXMLファイルに保存し、 XSLTを使用して投稿データをXMLとして並べ替えてそれを過去の投稿一覧の元データ としたいのです。投稿データは投稿順にXMLファイルに保存され、それを元の投稿の下に 返信が来てその下にまたその返信という風に並べ替えたいのです。 僕なりにスタイルシートを作ってみましたが、XLMとしてOUTPUTしたのに閉じるタグ が作成されなかったり、ルートノードが出てこなかったりします。上手くタグが整列しません。元の投稿データのような形で、投稿データの順番だけを並べ替えたいのです。 最近始めたばかりで頭が混乱してます。どなたかアドバイスお願いします。 元の投稿データ <?xml version="1.0" encoding="Shift_JIS"?> <?xml-stylesheet type="text/xsl" href="faqdata.xsl"?> <dataroot> <投稿 No="8" 親No="5" 階層="1"> <投稿日>2004/03/23 9:42:55</投稿日> <投稿者>なまえ7</投稿者> <e-mail>mail7 </e-mail> <投稿分類>1</投稿分類> <タイトル>たいとる7</タイトル> <内容>ないよう7</内容> </投稿> <投稿 No="7" 親No="1" 階層="3"> <投稿日>2004/03/23 9:41:24</投稿日> <投稿者>なまえ6</投稿者> <e-mail>mail6@co.jp</e-mail> <投稿分類>3</投稿分類> <タイトル>たいとる6</タイトル> <内容>ないよう6</内容> </投稿> <投稿 No="6" 親No="2" 階層="2"> <投稿日>2004/03/23 9:40:24</投稿日> <投稿者>なまえ5</投稿者> <e-mail>mail5@co.jp</e-mail> <投稿分類>3</投稿分類> <タイトル>たいとる5</タイトル> <内容>ないよう5</内容> </投稿> <投稿 No="5" 親No="4" 階層="1"> <投稿日>2004/03/23 9:39:53</投稿日> <投稿者>なまえ4</投稿者> <e-mail>mail4@ss.jp</e-mail> <投稿分類>1</投稿分類> <タイトル>たいとる4</タイトル> <内容>ないよう4</内容> </投稿> <投稿 No="4" 親No="3" 階層="1"> <投稿日>2004/03/23 9:39:10</投稿日> <投稿者>なまえ3</投稿者> <e-mail>mail3@co.jp</e-mail> <投稿分類>1</投稿分類> <タイトル>たいとる3</タイトル> <内容>ないよう3</内容> </投稿> <投稿 No="3" 親No="1" 階層="2"> <投稿日>2004/03/23 9:38:06</投稿日> <投稿者>なまえ2</投稿者> <e-mail>mail2@co.jp</e-mail> <投稿分類>3</投稿分類> <タイトル>たいとる2</タイトル> <内容>ないよう2</内容> </投稿> <投稿 No="2" 親No="2" 階層="1"> <投稿日>2004/03/18 16:46:00</投稿日> <投稿者>なまえ1</投稿者> <e-mail>mail1@co.jp</e-mail> <投稿分類>1</投稿分類> <タイトル>たいとる1</タイトル> <内容>ないよう1</内容> </投稿> <投稿 No="1" 親No="1" 階層="1"> <投稿日>2004/03/18 16:44:31</投稿日> <投稿者>なまえ</投稿者> <e-mail>mail@co.jp</e-mail> <投稿分類>1</投稿分類> <タイトル>たいとる</タイトル> <内容>ないよう</内容> </投稿> </dataroot> スタイルシート <?xml version="1.0" encoding="Shift_JIS"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" /> <xsl:template match="/"> <xsl:for-each select ="dataroot/投稿"> <xsl:sort select ="@親No" order="descending"/> <xsl:sort select ="@階層" order="ascending"/> <xsl:element name="投稿"> <xsl:attribute name="No"> <xsl:value-of select="@No" /> </xsl:attribute> <xsl:attribute name="親No"> <xsl:value-of select="@親No" /> </xsl:attribute> <xsl:attribute name="階層"> <xsl:value-of select="@階層" /> </xsl:attribute> <xsl:element name="投稿日"> <xsl:value-of select="投稿日" /> </xsl:element> <xsl:element name="投稿者"> <xsl:value-of select="投稿者" /> </xsl:element> <xsl:element name="e-mail"> <xsl:value-of select="e-mail" /> </xsl:element> <xsl:element name="投稿分類"> <xsl:value-of select="投稿分類" /> </xsl:element> <xsl:element name="タイトル"> <xsl:value-of select="タイトル" /> </xsl:element> <xsl:element name="内容"> <xsl:value-of select="内容" /> </xsl:element> </xsl:element> </xsl:for-each> </xsl:template> </xsl:stylesheet> 出力結果 <投稿 No="8" 親No="5" 階層="1"><投稿日>2004/03/23 9:42:55<投稿者>なまえ7mail7 <投稿分類>1<タイトル>たいとる7<内容>ないよう7<投稿 No="5" 親No="4" 階層="1"><投稿日>2004/03/23 9:39:53<投稿者>なまえ4mail4@ss.jp<投稿分類>1<タイトル>たいとる4<内容>ないよう4<投稿 No="4" 親No="3" 階層="1"><投稿日>2004/03/23 9:39:10<投稿者>なまえ3mail3@co.jp<投稿分類>1<タイトル>たいとる3<内容>ないよう3<投稿 No="2" 親No="2" 階層="1"><投稿日>2004/03/18 16:46:00<投稿者>なまえ1mail1@co.jp<投稿分類>1<タイトル>たいとる1<内容>ないよう1<投稿 No="6" 親No="2" 階層="2"><投稿日>2004/03/23 9:40:24<投稿者>なまえ5mail5@co.jp<投稿分類>3<タイトル>たいとる5<内容>ないよう5<投稿 No="1" 親No="1" 階層="1"><投稿日>2004/03/18 16:44:31<投稿者>なまえmail@co.jp<投稿分類>1<タイトル>たいとる<内容>ないよう<投稿 No="3" 親No="1" 階層="2"><投稿日>2004/03/23 9:38:06<投稿者>なまえ2mail2@co.jp<投稿分類>3<タイトル>たいとる2<内容>ないよう2<投稿 No="7" 親No="1" 階層="3"><投稿日>2004/03/23 9:41:24<投稿者>なまえ6mail6@co.jp<投稿分類>3<タイトル>たいとる6<内容>ないよう6 |
|
投稿日時: 2004-03-25 10:30
るぱんです。
以下の問題に対応します。 1.ルート要素が出てこない 2.閉じタグが表示されない 1.ルート要素が出てこない ルート要素が来た時に何もしていないのでルーと要素が出てきません。 下記のようにすればでます。 template match="/" element name="ROOT" for-each 2.閉じタグが表示されない メモリ上に展開されたデータ(XSLT変換後のデータ)をブラウザと言うビューワで見ている と考えてください。 個人で作成したXSLT変換後のメモリ上のデータ確認プログラム(ファイルに吐き出しているだけ)の状態で確認しましたが、閉じタグはでてきています。 〜TEMP.html〜 <head/> <body> <あ>い</あ> </body> では、 「<あ>い」 としか出力されません。 基本的にビューワとしてのIEは仕様として閉じタグを認識していません。 ですので、出力されていないと言うのが正解のようです。 |
|
投稿日時: 2004-03-25 11:06
るぱんさん、ありがとうございます。
教えて頂いた通りにelementでルート要素を追加してみましたが改善されませんでした。 2番目の問題と合わせて表示する方法が悪いんでしょうか? >個人で作成したXSLT変換後のメモリ上のデータ確認プログラム(ファイルに吐き出しているだけ)の状態で確認しましたが、閉じタグはでてきています。 この『メモリ上のデータ確認プログラム』とはマイクロソフトから提供されている XSLT変換ユーティリティ“msxsl.exe”のようなものでしょうか? お手数をお掛けしますがご教授よろしくお願いいたします。 |
|
投稿日時: 2004-03-25 11:46
るぱんです。
表示形式をxsl:output method="text" にしてみてください。 そこで表示される物がメモリ上で認識されている物です。 変換ツールは完全に僕が自作で作りこんだものです。 配布の予定はありません。 |
|
投稿日時: 2004-03-25 15:03
ご返信ありがとうございます。
xsl:output method="text" にしましたが、タグが取れた以外は変わりませんでした。 もう少し僕の方で調べてみます。ありがとうございました。 |
|
投稿日時: 2004-03-25 16:17
確認できました。
おせわになります。 MicrosoftのInternet Explorer Tools for Validating XML and Viewing XSLT Outputの Viewing XSL Outputを使用して変換後のXMLファイルを確認する事が出来ました。 どうもありがとうございました。 |
1