Personal tools
You are here: Home ブログ MAGIC V10解析(3)
« February 2012 »
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      
About this blog
 当ブログサイトでは、MAGIC(uniPaaS)やDB2に関する技術者向け情報を公開しています。お気軽にお立ち寄り下さい。
Recent comments
SUBJ1 How To Keep A Man Interested 2011-10-15
Re:Club DB2 2009/8/29 muka 2009-09-01
Re:Club DB2 2009/8/29 SIM 2009-08-31
 

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)
Size 8339 - File type text/html
MAGIC V10解析(2) MAGIC V10解析(2)
Size 8904 - File type text/html
Category(s)
dbMAGIC
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
スパム防止のためにコード入力が必要です。恐縮ですが下図の英数字を入力して下さい。