xsldbg.htmの使い方+IE5.0でのXSLのメモ

by Hippo2000(1999/9/10,14)

Microsoft社のIEはXML/XSLの環境を備えています。

他でも検索ツールとして利用しましたが、XSLのタグを中心に自分の備忘録的に作ってみました。
おまけにXSLの結果をすぐに確認できるようにIE5を利用した簡単なプログラムも書いてみました。

なお内容等が間違っていたら修正します。ご連絡ください。


目次


xsldbg.htmについて

xsldbg.htmはIE5を使ってXSLの動きを確認するために作ったサンプルプログラムです。
1つのXMLにXSLを適用した結果をすぐに確認することできます。後で出てくる例はこれを使って表示しました。

ここから(xsldbg001.lzh) xsldbg.htmやここで使ったxml、xslを一緒にダウンロードすることができます。
※99/9/14 22:00までリンクがずれていました。ダウンロードできずに申し訳ありませんでした。<(__)>

使い方

  1. IE5からxsldbg.htmを開きます。
    このとき「このページのソフトウェア(ActiveXコントロールの...」というメッセージが表示されます。
    これは内部でFileSystemObjectを利用しているためです。
    「Yes」が選択されないとこのプログラムはうまく動きません。
    (ファイルの内容を一度確認されることをお勧めします)
  2. XMLファイルを指定します。
  3. XSLファイルを指定します。XSLファイルの内容がテキストエリアに表示されます。
  4. 「適用」をクリックすると、ウィンドウが開き結果が表示されます。
    ラジオボタンによってブラウザに表示されるイメージ(HTML)か、出来あがったテキストそのもの(TEXT)かが選択できます。
  5. 保存とするとファイルの保存先を尋ねてきます(デフォルトは現在のXSLファイルの名前)。
    現在のテキストエリアの内容がそのまま指定されたファイルに出力されます。

一覧

要素(タグ)

xsl:stylesheet スタイルシートのドキュメント要素。xsl:templatexsl:script が入ります。
xsl:template 特定の型とコンテキストのノードのために望まれる出力のためのテンプレートを定義します。
xsl:value-of 選択されたノードの値をテキストで返します
xsl:copy ソースから出力に現在のノードをコピーします。
xsl:if 単純な条件分岐
xsl:choose 多値分岐
xsl:when 多値分岐
xsl:otherwise 多値分岐
xsl:for-each ノードの集まり(セット)に繰り返し、テンプレートを適用します。
xsl:apply-templates XSLプロセッサに型と選択された各ノードの内容に基づいて、適切なテンプレートを見つけるように指示します。
xsl:element 出力に指定された名前で要素を作成します。
xsl:attribute 属性(Attribute)ノードを作成し、出力要素(Element)にそれを付与します。
xsl:pi 出力に処理命令を生成します。
xsl:comment 出力にコメントを生成します。
xsl:script グローバル変数を定義したり、スクリプト拡張のための関数を定義します。
xsl:eval テキスト文字列を生成するためにスクリプト式を評価します。

メソッド

absoluteChildNumber すべての子孫のなかでのノードの数を返す
ancestoreChildNumber 一番近い祖先での指定されたノード名を持つノードの返す
childNumber 同じノード名の子孫に関連するノードの数
depth 指定されたノードが現れるドキュメントツリーでの深さ
formatDate 日付を指定されたオプションで整形する
formatIndex 指定された数値化システムを使って整数を整形します
formatNumber 指定されたフォーマットを使って数値を整形します
formatTime 時刻を指定された整形オプションを使って整形しいます
uniqueID 指定されたノードのユニークな識別子を返します。

使い方

ここでは以下のようなデータを例に使って説明したいと思います。

<?xml version="1.0" encoding="Shift_JIS" ?>
<?xml-stylesheet type="text/xsl" href="test01.xsl"?>
<本屋>
<店名>河馬屋書店</店名>
<ロゴ>kabaya.gif</ロゴ>
<本 dsp="7">
<題>河馬の塔</題><作者>河馬谷一郎</作者><値段>1500</値段>
</本>
<本 dsp="6">
<題>河馬屋(ひっぽや)</題><作者>河馬川次郎</作者><値段>800</値段>
</本>
<本 dsp="5">
<題>写真集:河馬の群れ(カード付き)</題><作者>河馬山三郎</作者><値段>3600</値段>
</本>
<本 dsp="5">
<題>河馬の大国</題><作者>河馬三郎</作者><値段>3200</値段>
</本>
<img src="tel.gif"/>
<電話>HIPPO-2000</電話>
</本屋>

基本形(xsl:sytelesheet,xsl:template,xsl:value-of)

最も単純なXSLの指定として、固定のタイトルをつけ、店の名前と電話を表示するだけように以下のものを指定します。

XSL

<?xml version="1.0" encoding="Shift_JIS" ?>
<!-- xslの名前空間の定義 -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<!-- 全体にマッチ -->
<xsl:template match="/">
        <HTML>
        <HEAD>
        <TITLE>基本形(とっても簡単)(ex.1)</TITLE>
        </HEAD>
        <BODY>
        <H1>今週の新刊</H1>
        <H2>皆様の店!</H2><xsl:value-of select="//本屋/店名"/><br/>
        <H2>電話番号</H2><xsl:value-of select="//本屋/電話"/><br/>
        </BODY>
        </HTML>
</xsl:template>
</xsl:stylesheet>

処理結果

<HTML>
<HEAD>
<TITLE>基本形(とっても簡単)(ex.1)</TITLE>
</HEAD>
<BODY>
<H1>今週の新刊</H1>
<H2>皆様の店!</H2>河馬屋書店<br />
<H2>電話番号</H2>HIPPO-2000<br />
</BODY>
</HTML>


繰り返し(xsl:for-each)

例のなかでにある複数の「本」に対応するために繰り返しを行います。

XSL

<?xml version="1.0" encoding="Shift_JIS" ?>
<!-- xslの名前空間の定義 -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<!-- まず全体にマッチさせる -->
<xsl:template match="/">
        <HTML>
        <HEAD>
        <TITLE>繰り返し(ex.2)</TITLE>
        </HEAD>
        <BODY>
        <H1>今週の新刊</H1>
        <H2>皆様の店!<xsl:value-of select="本屋/店名"/></H2>
        <HR/>
        <!-- FOR EACH -->
        <xsl:for-each select="本屋/本">
            <H3><xsl:value-of select="題"/></H3>
        </xsl:for-each>
        <!-- FOR EACH -->
        <HR/>
        <H3>電話番号:<xsl:value-of select="本屋/電話"/></H3>
        </BODY>
        </HTML>
</xsl:template>
</xsl:stylesheet>

処理結果

<HTML>
<HEAD>
<TITLE>繰り返し(ex.2)</TITLE>
</HEAD>
<BODY>
<H1>今週の新刊</H1>
<H2>皆様の店!河馬屋書店</H2>
<HR />
<H3>河馬の塔</H3>
<H3>河馬屋(ひっぽや)</H3>
<H3>写真集:河馬の群れ(カード付き)</H3>
<H3>河馬の大国</H3>
<HR />
<H3>電話番号:HIPPO-2000</H3>
</BODY>
</HTML>

 


条件分岐、多値分岐(xsl:if,xsl:choose,xsl:when,xsl:)

本の値段に合わせてメッセージを変えるようにif分岐、多岐分岐をします。

XSL

<?xml version="1.0" encoding="Shift_JIS" ?>
<!-- xslの名前空間の定義 -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<!-- まず全体にマッチさせる -->
<xsl:template match="/">
        <HTML>
        <HEAD>
        <TITLE>条件分岐付き(ex.3)</TITLE>
        </HEAD>
        <BODY>
        <H1>今週の新刊</H1>
        <H2>皆様の店!<xsl:value-of select="本屋/店名"/></H2>
        <HR/>
        <xsl:for-each select="本屋/本">
            <!-- IF -->
            <xsl:if test="値段[. > 3500]">
                豪華!(<xsl:value-of select="値段"/>円)<br/>
            </xsl:if>
            <!-- IF -->
            <!-- choose,when -->
            <xsl:choose>
                <xsl:when test="値段[. $le$ 1000]" >
                        お徳用:<xsl:value-of select="題"/>:<xsl:value-of select="値段"/><br/>
                </xsl:when>
                <xsl:when test="値段[. $le$ 2000]" >
                        御手頃:<xsl:value-of select="題"/>:<xsl:value-of select="値段"/><br/>
                </xsl:when>
                <xsl:otherwise>
                        保存版:<xsl:value-of select="題"/>:<xsl:value-of select="値段"/><br/>
                </xsl:otherwise>
            </xsl:choose>
        </xsl:for-each>
        <HR/>
        <H3>電話番号:<xsl:value-of select="本屋/電話"/></H3>
        </BODY>
        </HTML>
</xsl:template>
</xsl:stylesheet>

処理結果

<HTML>
<HEAD>
<TITLE>条件分岐付き(ex.3)</TITLE>
</HEAD>
<BODY>
<H1>今週の新刊</H1>
<H2>皆様の店!河馬屋書店</H2>
<HR />

       御手頃:河馬の塔:1500<br />

       お徳用:河馬屋(ひっぽや):800<br />

      豪華!(3600円)<br />

       保存版:写真集:河馬の群れ(カード付き):3600<br />

       保存版:河馬の大国:3200<br />
<HR />
<H3>電話番号:HIPPO-2000</H3>
</BODY>
</HTML>

テンプレートの適用(xsl:applytemplate,xsl:template)

xsl:templateとxsl:applytemplateを利用することにより、要素毎の処理をサブルーチン的にまとめることができます。

XSL

<?xml version="1.0" encoding="Shift_JIS" ?>
<!-- xslの名前空間の定義 -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<!-- まず全体にマッチさせる -->
<xsl:template match="/">
        <HTML>
        <HEAD>
        <TITLE>TEMPLATEの適用(ex.4)</TITLE>
        </HEAD>
        <BODY>
        <H1>今週の新刊</H1>
        <H2>皆様の店!<xsl:value-of select="本屋/店名"/></H2>
        <HR/>
        <xsl:for-each select="本屋/本">
                <xsl:apply-templates select="." />
        </xsl:for-each>
        <HR/>
        <H3>電話番号:<xsl:value-of select="本屋/電話"/></H3>
        </BODY>
        </HTML>
</xsl:template>
<!-- 本のスタイルの定義 -->
<xsl:template match="本">
    <!-- IF -->
    <xsl:if test="値段[. > 3500]">
        豪華!(<xsl:value-of select="値段"/>円)<br/>
    </xsl:if>
    <!-- IF -->
    <!-- choose,when -->
    <xsl:choose>
        <xsl:when test="値段[. $le$ 1000]" >
            お徳用:<xsl:value-of select="題"/>:<xsl:value-of select="値段"/><br/>
        </xsl:when>
        <xsl:when test="値段[. $le$ 2000]" >
            御手頃:<xsl:value-of select="題"/>:<xsl:value-of select="値段"/><br/>
        </xsl:when>
        <xsl:otherwise>
            保存版:<xsl:value-of select="題"/>:<xsl:value-of select="値段"/><br/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
</xsl:stylesheet>

処理結果

<HTML>
<HEAD>
<TITLE>TEMPLATEの適用(ex.4)</TITLE>
</HEAD>
<BODY>
<H1>今週の新刊</H1>
<H2>皆様の店!河馬屋書店</H2>
<HR />

     御手頃:河馬の塔:1500<br />

     お徳用:河馬屋(ひっぽや):800<br />

 豪華!(3600円)<br />

     保存版:写真集:河馬の群れ(カード付き):3600<br />

     保存版:河馬の大国:3200<br />
<HR />
<H3>電話番号:HIPPO-2000</H3>
</BODY>
</HTML>

スクリプト(xsl:script, xsl:eval)

内部でスクリプトを書くことが出来ます。(デフォルトはJScript。VBScriptも使えます。)
ここでは合計金額を求めています。

XSL

<?xml version="1.0" encoding="Shift_JIS"?>
<!-- xslの名前空間の定義 -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<xsl:script language="JScript">
var iAll;
iAll = 0;
function SumDes(iVal) {
        var sTxt;
        sTxt = iVal.text;
        iAll = iAll + (parseInt(iVal.text));
        return "";
}
</xsl:script>
<!-- まず全体にマッチさせる -->
<xsl:template>
        <HTML>
        <HEAD>
        <TITLE>Scriptで集計(ex.5)</TITLE>
        </HEAD>
        <BODY>
        <H1>今週の新刊</H1>
        <H2>皆様の店!<xsl:value-of select="本屋/店名"/></H2>
        <HR/>
        <xsl:apply-templates order-by="-number(値段)" select="本屋/本" />
        全部買うと...:<xsl:eval>iAll;</xsl:eval>円!
        <HR/>
        <H3>電話番号:<xsl:value-of select="本屋/電話"/></H3>
        </BODY>
        </HTML>
</xsl:template>
<!-- 本のスタイルの定義 -->
<xsl:template match="本">
        <xsl:apply-templates select="値段" />
    <!-- choose,when -->
    <xsl:choose>
        <xsl:when test="値段[. $le$ 1000]" >
            お徳用:<xsl:value-of select="題"/>:<xsl:value-of select="値段"/><br/>
        </xsl:when>
        <xsl:when test="値段[. $le$ 2000]" >
            御手頃:<xsl:value-of select="題"/>:<xsl:value-of select="値段"/><br/>
        </xsl:when>
        <xsl:otherwise>
            保存版:<xsl:value-of select="題"/>:<xsl:value-of select="値段"/><br/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>
<!-- 値段のスタイルの定義 -->
<xsl:template match="値段">
        <xsl:eval language="JScript">SumDes(this);</xsl:eval>
</xsl:template>
</xsl:stylesheet>

処理結果

<HEAD>
<TITLE>Scriptで集計(ex.5)</TITLE>
</HEAD>
<BODY>
<H1>今週の新刊</H1>
<H2>皆様の店!河馬屋書店</H2>
<HR />


     保存版:写真集:河馬の群れ(カード付き):3600<br />


     保存版:河馬の大国:3200<br />


     御手頃:河馬の塔:1500<br />


     お徳用:河馬屋(ひっぽや):800<br />

 全部買うと...:9100円!
 <HR />
<H3>電話番号:HIPPO-2000</H3>
</BODY>
</HTML>


ノード操作(xsl:element, xsl:atttribute, xsl:pi, xsl:comment)

値に合わせて新しい要素を作ったり、コメントを追加することができます。

XSL

<?xml version="1.0" encoding="Shift_JIS" ?>
<!-- xslの名前空間の定義 -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<!-- まず全体にマッチさせる -->
<xsl:template match="/">
        <HTML>
        <xsl:pi name="xkaba">desu='1'</xsl:pi>
        <xsl:comment>kabadesu </xsl:comment>
        <HEAD>
        <TITLE>ノードの操作(ex.6)</TITLE>
        </HEAD>
        <BODY>
        <H1>今週の新刊</H1>
        <xsl:element name="img">
                <xsl:attribute name="src"><xsl:value-of select="本屋/ロゴ"/></xsl:attribute>
        </xsl:element>
        <H2>皆様の店!<xsl:value-of select="本屋/店名"/></H2>
        <HR/>
        <xsl:for-each select="本屋/本">
                <xsl:apply-templates select="." />
        </xsl:for-each>
        <HR/>
        <xsl:apply-templates select="本屋/img" />
        <H3>電話番号:<xsl:value-of select="本屋/電話"/></H3>
        </BODY>
        </HTML>
</xsl:template>
<!-- 本のスタイルの定義 -->
<xsl:template match="本">
    <xsl:element name="font">
        <xsl:attribute name="size"><xsl:value-of select="./@dsp"/></xsl:attribute>
        <xsl:choose>
            <xsl:when test="値段[. $le$ 1000]" >
                お徳用:
            </xsl:when>
            <xsl:when test="値段[. $le$ 2000]" >
                御手頃:
            </xsl:when>
            <xsl:otherwise>
                保存版:
            </xsl:otherwise>
        </xsl:choose>
        <xsl:value-of select="題"/>:<xsl:value-of select="値段"/>
    </xsl:element>
    <br/>
</xsl:template>
<!-- imgのイメージ -->
<xsl:template match="img">
  <xsl:copy>
    <xsl:attribute name="src"><xsl:value-of select="@src"/></xsl:attribute>
    <xsl:attribute name="width">50</xsl:attribute>
    <xsl:attribute name="height">50</xsl:attribute>
  </xsl:copy>
</xsl:template>
</xsl:stylesheet>

処理結果

<HTML>
<?xkaba desu='1'?>
<!--kabadesu -->
<HEAD>
<TITLE>ノードの操作(ex.6)</TITLE>
</HEAD>
<BODY>
<H1>今週の新刊</H1>
<img src="kabaya.gif" />
<H2>皆様の店!河馬屋書店</H2>
<HR />
<font size="7">

      御手頃:
     河馬の塔:1500
</font>
<br />
<font size="6">

      お徳用:
     河馬屋(ひっぽや):800
</font>
<br />
<font size="5">

      保存版:
     写真集:河馬の群れ(カード付き):3600
</font>
<br />
<font size="5">

      保存版:
     河馬の大国:3200
</font>
<br />
<HR />
<img src="tel.gif" width="50" height="50" />
<H3>電話番号:HIPPO-2000</H3>
</BODY>
</HTML>

参考資料

Microsoft社のサイト:
あいにくと英語ですが、リファレンスなので見ておかないと...
XML DOM Reference http://msdn.microsoft.com/xml/reference/xmldom/start.asp
XSL Developer's Guide: http://msdn.microsoft.com/xml/xslguide/default.asp
XSL Reference : http://msdn.microsoft.com/xml/reference/xsl/start.asp
DHTML Reference: http://msdn.microsoft.com/workshop/author/dhtml/reference/dhtmlrefs.asp

ホーム Perlの小技

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。