パーソナルツール
現在の場所: ホーム ブログ MAGIC V10解析(3)
« 2018January »
Su Mo Tu We Th Fr Sa
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
このBlogについて
 代表の向井田ことMUKAです。当ブログサイトでは、MAGICやDB2に関する技術者向け情報を公開しています。お気軽にお立ち寄り下さい。
最近のエントリ
twitter / 新RT機能を英語モードで・・・ muka 2009年11月19日
twitter / List Widget muka 2009年11月03日
twitter API / Retweet の仕様が・・・ muka 2009年10月30日
twitter API / Lists muka 2009年10月24日
IBM Rational Software Conference 2009 と アジャイル開発 muka 2009年10月08日
twitter API / geoタグ! muka 2009年10月01日
Twitter Developers Meetup in Tokyo muka 2009年09月11日
Club DB2 2009/9/4 muka 2009年09月05日
最近のコメント
Re:Club DB2 2009/8/29 muka 2009年09月01日
Re:Club DB2 2009/8/29 SIM 2009年08月31日
最近のトラックバック
Club DB2 8/29の感想エントリと今後の予定 Unofficial DB2 BLOG 2009年09月01日
カテゴリ
misc (47)
dbMAGIC (47)
DB2 (47)
mail (47)
Web (47)
twitter (47)
 

MAGIC V10解析(3)


 今日はクライアントの人たち(同業者)と、ちょっとした忘年会でした。ほんとに楽しかった。話題は尽きず、あっという間に数時間が過ぎてしまった・・・。
 ということで、今帰ったところです。
 その席上、このブログを見てくれていると聞いて、ちょっと嬉しかった。でもその彼に言われた。「あんなこと書いて良いんですか?」って・・・。どういう意味かと一瞬考えたけど、「え、誰もみてないでしょう?」と思わず答えてしまった・・・。うーん、変な応え・・・。(^^;
 でも、なんか悪いこと書いてるのかな?(w)

 さて、前回までは、プログラムの一覧の取得だったんですが、それよりちょっとやっかいな問題は、タスクの一覧取得です。なぜなら、タスクは再帰的に記述されているんです。
 あまりよい例が無いので、テスト用にプログラムを作成してみます。

v10tasktree.jpg

 このプログラムのXMLファイルをブラウザで見たのが下図です。

v10taskxmltree.jpg

 そう、<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()」関数は文字列の連結を行うものです。
 さて、結果を見てみましょう!

v10tasktreeres.jpg

 あれ?なんで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)

v10tasktreetbl.jpg



MAGIC V10解析(1) MAGIC V10解析(1)
サイズ 8337 - File type text/html
MAGIC V10解析(2) MAGIC V10解析(2)
サイズ 8904 - File type text/html
カテゴリ
dbMAGIC