- PR -

XSLTでの並べ替えが上手くいかない

1
投稿者投稿内容
とっと
大ベテラン
会議室デビュー日: 2004/03/25
投稿数: 197
投稿日時: 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
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 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
投稿数: 197
投稿日時: 2004-03-25 11:06
るぱんさん、ありがとうございます。

教えて頂いた通りにelementでルート要素を追加してみましたが改善されませんでした。

2番目の問題と合わせて表示する方法が悪いんでしょうか?

>個人で作成したXSLT変換後のメモリ上のデータ確認プログラム(ファイルに吐き出しているだけ)の状態で確認しましたが、閉じタグはでてきています。

この『メモリ上のデータ確認プログラム』とはマイクロソフトから提供されている
XSLT変換ユーティリティ“msxsl.exe”のようなものでしょうか?

お手数をお掛けしますがご教授よろしくお願いいたします。
るぱん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 1370
投稿日時: 2004-03-25 11:46
るぱんです。

表示形式をxsl:output method="text"
にしてみてください。

そこで表示される物がメモリ上で認識されている物です。

変換ツールは完全に僕が自作で作りこんだものです。
配布の予定はありません。
とっと
大ベテラン
会議室デビュー日: 2004/03/25
投稿数: 197
投稿日時: 2004-03-25 15:03
ご返信ありがとうございます。

xsl:output method="text" にしましたが、タグが取れた以外は変わりませんでした。

もう少し僕の方で調べてみます。ありがとうございました。
とっと
大ベテラン
会議室デビュー日: 2004/03/25
投稿数: 197
投稿日時: 2004-03-25 16:17
確認できました。
おせわになります。

MicrosoftのInternet Explorer Tools for Validating XML and Viewing XSLT Outputの
Viewing XSL Outputを使用して変換後のXMLファイルを確認する事が出来ました。

どうもありがとうございました。
1

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