XML/XSLについて

[9393]XML/XSLについて 投稿者:あき 投稿日:2006/06/26(Mon) 22:24
ちょっと(かなり?)分野違いの質問かもしれませんが、ご存知の方がいらしたら、ぜひ教えて下さい。
InDesignで作ったデータをXMLで書き出し、XSLを使ってブラウザで表示させる仕事にとりかかっています。

XML文書のなかで、フラットでない構造の部分をそのままHTMLのテーブルと同じ形で表示したいのですが、どうすればいいのか全く分かりません。

以下のような構造を持ったXMLをXSL上でどのようなテンプレートを作ればいいのでしょうか?

<Root><record><書き出し料金>
<料金表>
<料金表列>
<料金表セル></料金表セル>
<料金表セル></料金表セル>
<料金表セル></料金表セル>
<料金表セル></料金表セル>
</料金表列>
<料金表列>
<料金表セル></料金表セル>
<料金表セル>8,505</料金表セル>
<料金表セル>6,615</料金表セル>
<料金表セル>5,670</料金表セル>
</料金表列>
<料金表列>
<料金表セル></料金表セル>
<料金表セル>8,978</料金表セル>
<料金表セル>7,088</料金表セル>
<料金表セル>6,143</料金表セル>
</料金表列></record></Root>

形としては<書き出し料金>=<table>、<料金表列>=<tr>、<料金表セル>=<td>というように、HTMLとまったく同じ構造になっているので、簡単だと思ったのですが、なかなか出口がみえません………
» 1
[9393へのレス]Re: XML/XSLについて 投稿者:篠原酒店 投稿日:2006/06/26(Mon) 22:44
XSLTまではいじっていませんが、変換後の形は見えているわけで、書籍やサイトを調べまくって似たような変換スタイルをトライ&エラーで試してみるしかないでしょう。

#XMLデータを「作った」ことはあるけど、その変換の流れをどう作るかまでは考えたことがないので。
» 2
[9393へのレス]Re: XML/XSLについて 投稿者:あき 投稿日:2006/06/27(Tue) 08:28
篠原酒店さん。

アドバイスありがとうございます。
色々なサイトを見ているのですが、なかなか似たような例が見つからず、納期も近づいてくるし、まいってます。。

しかし今後、このように冊子下版→冊子情報をHTMLに書き出しといった仕事は増えてくるのではないかと思われますので、がんばって取り組んで見ようと思います。
» 3
[9393へのレス]Re: XML/XSLについて 投稿者:いき 投稿日:2006/06/27(Tue) 12:28
私もxsltはまだ勉強してないので、自分に理解できる範囲でxslを作ってみました。
まず、あきさんのxmlからRoot以下の親タグを少し削り、<td>にあたるセル用のタグをそれぞれ<ryokin1> <ryokin2> <ryokin3> <ryokin4>と別名にしたxmlを作りました。
------------------------------------------
<?xml version="1.0" encoding="Shift_JIS" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<Root>
<retsu>
<ryokin1></ryokin1>
<ryokin2></ryokin2>
<ryokin3></ryokin3>
<ryokin4></ryokin4>
</retsu>
<retsu>
<ryokin1></ryokin1>
<ryokin2>8,505</ryokin2>
<ryokin3>6,615</ryokin3>
<ryokin4>5,670</ryokin4>
</retsu>
<retsu>
<ryokin1></ryokin1>
<ryokin2>8,978</ryokin2>
<ryokin3>7,088</ryokin3>
<ryokin4>6,143</ryokin4>
</retsu>
</Root>
------------------------------------------
で、xslはこちら。“style.xsl”としました。
------------------------------------------
<?xml version="1.0" encoding="Shift_JIS" standalone="yes"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">

<xsl:template match="/">
<html>
<head><title>実験</title></head>
<body>
<table border="1" width="500">
<tr><th>ryokin1</th><th>ryokin2</th><th>ryokin3</th><th>ryokin4</th></tr>
<xsl:apply-templates select="//retsu">
</xsl:apply-templates>
</table>
</body>
</html>
</xsl:template>

<xsl:template match="retsu">
<tr>
<td align="right"><xsl:value-of select="ryokin1" /></td>
<td align="right"><xsl:value-of select="ryokin2" /></td>
<td align="right"><xsl:value-of select="ryokin3" /></td>
<td align="right"><xsl:value-of select="ryokin4" /></td>
</tr>
</xsl:template>
</xsl:stylesheet>
------------------------------------------
なお、<ryokin1>~<ryokin4>タグをタイトルとして表上部に表示しています。
これで、私の環境(Win XP Pro sp1)で一応表示はできました。
回答になっているか、参考になるかはわかりませんが。
» 4
[9393へのレス]Re: XML/XSLについて 投稿者:いき 投稿日:2006/06/27(Tue) 13:46
自己レスです。

>まず、あきさんのxmlからRoot以下の親タグを少し削り、

削る必要はなさそうですね^^;
» 5
[9393へのレス]Re: XML/XSLについて 投稿者:あき 投稿日:2006/06/28(Wed) 08:35
いきさん>

ご回答ありがとうございました。
きちんと表示できました。
ただ、タグをふりなおすという作業をおこなえないこと(実際XMLファイルは250ありますので、時間的に現実的でない)
と、<Root><record><ryokin>という孫タグまでなら問題ないのですが、さらにその子供を表示する事がどうしても出来ずにつまずいていた次第です。

知識がないので、何がたりていないのか、何を覚えればいいのか、と行った事もわからず五里霧中状態でした(--;;

しかし、XSL:for-eachというのを使えばいいらしい、という事までは分かりました。(^^)
» 6
[9393へのレス]Re: XML/XSLについて 投稿者:いき 投稿日:2006/06/28(Wed) 08:46
> しかし、XSL:for-eachというのを使えばいいらしい、という事までは分かりました。(^^)

うーむ。私も知識のないままレスしてしまってすみませんが……。
xsl:for-each使っても、
xsl:value-of select=""
で子要素を指定してやる必要がありますよね。
そうなると、タグ名が同じってのがネックになりませんか?
» 7
[9393へのレス]Re: XML/XSLについて 投稿者:CL 投稿日:2006/06/29(Thu) 13:35
s.xml(整形式に書き直しました)
----
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="s.xsl"?>
<Root><record><書き出し料金>
<料金表>
<料金表列>
<料金表セル></料金表セル>
<料金表セル></料金表セル>
<料金表セル></料金表セル>
<料金表セル></料金表セル>
</料金表列>
<料金表列>
<料金表セル></料金表セル>
<料金表セル>8,505</料金表セル>
<料金表セル>6,615</料金表セル>
<料金表セル>5,670</料金表セル>
</料金表列>
<料金表列>
<料金表セル></料金表セル>
<料金表セル>8,978</料金表セル>
<料金表セル>7,088</料金表セル>
<料金表セル>6,143</料金表セル>
</料金表列>
</料金表>
</書き出し料金></record></Root>

s.xsl
----
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xh="http://www.w3.org/1999/xhtml"
exclude-result-prefixes="xh">

<xsl:output method="xml" omit-xml-declaration="no"
version="1.0" encoding="UTF-8" indent="yes"
doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" />
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type"
content="application/xhtml+xml; charset=UTF-8" />
<style type="text/css">
table,td {
border: 1px solid #aaa;
}
</style>

<title>
test
</title>
</head>
<body>
<xsl:apply-templates select="Root" />
</body>
</html>
</xsl:template>

<xsl:template match="Root">
<xsl:apply-templates select="record" />
</xsl:template>

<xsl:template match="record">
<xsl:apply-templates select="書き出し料金" />
</xsl:template>

<xsl:template match="書き出し料金">
<xsl:apply-templates select="料金表" />
</xsl:template>

<xsl:template match="料金表">
<table>
<xsl:apply-templates select="料金表列" />
</table>
</xsl:template>

<xsl:template match="料金表列">
<tr>
<xsl:apply-templates select="料金表セル" />
</tr>
</xsl:template>

<xsl:template match="料金表セル">
<td>
<xsl:value-of select="." />
</td>
</xsl:template>

</xsl:stylesheet>

----

これでどうですか?
» 8
[9393へのレス]Re: XML/XSLについて 投稿者:いき 投稿日:2006/06/29(Thu) 14:25
CLさん、フォローありがとうございます。
勉強になります。

あきさん、変なレスで混乱させてすみませんでした。
» 9
[9393へのレス]Re: XML/XSLについて 投稿者:CL 投稿日:2006/06/29(Thu) 15:10
その後いろいろ調べた結果、
http://mixi.jp/view_bbs.pl?id=8052030&comment_count=5&comm_id=10433
の4番の方の回答がエレガントですね。
僕のやつだと、馬鹿正直に次に来る要素を指定しています
ので、応用力に欠けます。
mixiのXSLTコミュニティの回答の方を参考にしてください。
» 10
[9393へのレス]レス遅くて申し訳ありません。 投稿者:あき 投稿日:2006/07/03(Mon) 16:43
CLさん>

ありがとうございました。
実際mixiの4番がスマートですね(^^)
同じ事をするにも色々なアプローチがあって大変勉強になりました。
今後も勉強を続けて行きたいです。

いきさん>
私も自分で考えた訳ではないのですが(汗)
エラー起きずに表示できたので、多分問題ないと思います。
どうもまだテンプレートの読み方がいまいち分からなくて……
自分で書けるようになるにはまだまだ時間がかかるかと(--;;
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)

このページをシェア