2006/12/21
MAGIC V10解析(3)
今日はクライアントの人たち(同業者)と、ちょっとした忘年会でした。ほんとに楽しかった。話題は尽きず、あっという間に数時間が過ぎてしまった・・・。
ということで、今帰ったところです。
その席上、このブログを見てくれていると聞いて、ちょっと嬉しかった。でもその彼に言われた。「あんなこと書いて良いんですか?」って・・・。どういう意味かと一瞬考えたけど、「え、誰もみてないでしょう?」と思わず答えてしまった・・・。うーん、変な応え・・・。(^^;
でも、なんか悪いこと書いてるのかな?(w)
さて、前回までは、プログラムの一覧の取得だったんですが、それよりちょっとやっかいな問題は、タスクの一覧取得です。なぜなら、タスクは再帰的に記述されているんです。
あまりよい例が無いので、テスト用にプログラムを作成してみます。
このプログラムのXMLファイルをブラウザで見たのが下図です。
そう、<Task>タグの中に、また<Task>タグが出てくるんですね!
でも、ご安心。XSLTは何だってできます!
取り敢えず、いつものように、prg03.htmlを作成して、9行目と、12行目を下記のように修正します。(##の部分はテストするプログラムのid番号を指定します。)
9行目: objDoc.load("Source/Prg_##.xml");12行目: objStl.load("prg03.xsl");prg03.xslは下記のソースをコピペします。<?xml version="1.0" encoding="Shift_JIS" ?>①、②と入れたところは、ソースに書かないで下さいね。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html" version="4.0" encoding="Shift_JIS" />
<xsl:template match="/">
<html>
<head><title>プログラム内タスク一覧(その1)</title></head>
<body>
<xsl:apply-templates select="Application" />
</body>
</html>
</xsl:template>
<xsl:template match="Application">
<xsl:apply-templates select="ProgramsRepository" />
</xsl:template>
<xsl:template match="ProgramsRepository">
<xsl:apply-templates select="Programs" />
</xsl:template>
<xsl:template match="Programs">
<xsl:apply-templates select="Task" /> ・・・①
</xsl:template>
<xsl:template match="Task">
<xsl:value-of select="concat(Header/@ISN_2,'.',
Header/@Description)" /><br/>
<xsl:apply-templates select="Task"/> ・・・②
</xsl:template>
</xsl:stylesheet>
①で呼ばれるテンプレートの中の②のところで、再度自分自身(Taskのテンプレート)を呼んでいます。(ここがミソです!)
これで、再帰的に、タスクの番号(Header/@ISN_2)とタスク名(Header/@Description)の一覧を取得します。「concat()」関数は文字列の連結を行うものです。
さて、結果を見てみましょう!

あれ?なんで6の次が8なの?
そう言えば、間違って作成してしまったタスクを1個削除したんです。それで1個飛んでしまったわけですね。(なるほど・・・)
一応、タスクの一覧は取得できたんですけど、これではツリーっぽくないですね。ネストしてる雰囲気が無いので、ちょっと工夫してみたのが次の改良版です。
<?xml version="1.0" encoding="Shift_JIS" ?>一部、ちょっと荒っぽい書き方してるんですが、ご勘弁・・・。
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html" version="4.0" encoding="Shift_JIS" />
<xsl:template match="/">
<html>
<head><title>プログラム内タスク一覧(その2)</title></head>
<body>
Version : <xsl:value-of select="Application/Header/Version/@val"/><br/>
WithIsn : <xsl:value-of select="Application/Header/WithIsn/@val"/><br/>
IsRoot : <xsl:value-of select="Application/Header/IsRoot/@val"/><br/>
InIndex : <xsl:value-of select="Application/Header/InIndex/@val"/><br/>
<p />
<xsl:apply-templates select="Application" />
</body>
</html>
</xsl:template>
<xsl:template match="Application">
<xsl:apply-templates select="ProgramsRepository" />
</xsl:template>
<xsl:template match="ProgramsRepository">
<xsl:apply-templates select="Programs" />
</xsl:template>
<xsl:template match="Programs">
<table border="2" width="100%" align="center">
<tr bgcolor="#f0f0c0">
<td align="center" colspan="10"><b>ProgramsRepository</b></td>
</tr>
<tr bgcolor="#c0f0f0">
<td width="4%" align="center" valign="middle" rowspan="2">
<nobr>No.</nobr></td>
<td width="4%" align="center" valign="middle" rowspan="2">
<nobr>Levl</nobr></td>
<td width="4%" align="center" valign="middle" rowspan="2">
<nobr>Tree</nobr></td>
<td width="2%" align="center" valign="middle" rowspan="2">
<nobr>B/O</nobr></td>
<td width="36%" align="center" valign="middle" rowspan="2">
<nobr>Description</nobr></td>
<td width="10%" align="center" valign="middle" colspan="2">
<nobr>Parameters</nobr></td>
<td width="10%" align="center" valign="middle" colspan="2">
<nobr>LastModified</nobr></td>
<td width="30%" align="center" valign="middle" rowspan="2">
<nobr>Comment</nobr></td>
</tr>
<tr bgcolor="#c0f0f0">
<td width="5%" align="center" valign="middle">
<nobr>Count</nobr></td>
<td width="5%" align="center" valign="middle">
<nobr>Attributes</nobr></td>
<td width="5%" align="center" valign="middle">
<nobr>Date</nobr></td>
<td width="5%" align="center" valign="middle">
<nobr>Time</nobr></td>
</tr>
<xsl:apply-templates select="Task" />
</table>
<p />
</xsl:template>
<xsl:template match="Task">
<xsl:param name="TDepth" select="0" />
<xsl:param name="TreeID" select="0" />
<tr>
<td align="right"><xsl:value-of select="Header/@ISN_2" /></td>
<td align="right"><xsl:value-of select="$TDepth" /></td>
<td><xsl:value-of select="substring(concat($TreeID,'.'
,string(position())),4)" /></td>
<td><xsl:value-of select="Header/TaskType/@val" /></td>
<td><xsl:value-of select="Header/@Description" /></td>
<td align="right">
<xsl:value-of select="Header/ReturnValue/ParametersCount/@val"/>
</td>
<td align="left">
<xsl:value-of
select="Header/ReturnValue/ParametersAttributes/@ParametersAttributes"/>
</td>
<td><xsl:value-of select="Header/LastModified/@date"/></td>
<td><xsl:value-of select="Header/LastModified/@time"/></td>
<td><xsl:value-of select="Header/Comment/@val"/></td>
</tr>
<xsl:apply-templates select="Task">
<xsl:with-param name="TDepth" select="$TDepth + 1" />
<xsl:with-param name="TreeID" select="concat($TreeID,'.',
string(position()))"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>
結果は次の通り!おぉ、やればできるもんです。(>XSLT)

- Category(s)
- dbMAGIC
