by Hippo2000(1999/9/10,14)
Microsoft社のIEはXML/XSLの環境を備えています。
他でも検索ツールとして利用しましたが、XSLのタグを中心に自分の備忘録的に作ってみました。
おまけにXSLの結果をすぐに確認できるようにIE5を利用した簡単なプログラムも書いてみました。なお内容等が間違っていたら修正します。ご連絡ください。
xsldbg.htmはIE5を使ってXSLの動きを確認するために作ったサンプルプログラムです。
1つのXMLにXSLを適用した結果をすぐに確認することできます。後で出てくる例はこれを使って表示しました。
ここから(xsldbg001.lzh) xsldbg.htmやここで使ったxml、xslを一緒にダウンロードすることができます。
※99/9/14 22:00までリンクがずれていました。ダウンロードできずに申し訳ありませんでした。<(__)>

xsl:stylesheet スタイルシートのドキュメント要素。xsl:templateとxsl: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の指定として、固定のタイトルをつけ、店の名前と電話を表示するだけように以下のものを指定します。
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
<?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> |
![]() |
本の値段に合わせてメッセージを変えるように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: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> |
![]() |
内部でスクリプトを書くことが出来ます。(デフォルトは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
<?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> |
![]() |
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。