XSLT



XSLTとは

 XSLはEXtensible Stylesheet Languageの略であり、XMLのスタイルシートです。XSLTは XSL Transformation の略で、XMLをXSLを使ってHTMLに変換することを意味します。XSLTを使うとXMLをブラウザで見やすく表示できます。

 XSLファイルをXMLに関連付けるには、下の例のようにします。この例で、href属性に具体的なXSLのURLを指定します。

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="filename.xsl"?>
<root>
  ...
</root>

 XSLファイルはXMLファイルの一種で名前空間 xsl をタグで使用します。下の例は一般的なXSLファイルの構造です。...の部分に具体的な変換ルールを記述します。変換ルールはテンプレートと呼ばれるXSLTタグとHTMLで構成されます。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  ....
</xsl:template>
</xsl:stylesheet>

 

XSLのテンプレート

<xsl:template>

 xsl:templateはテンプレートを定義するのに使います。match属性で指定したパスと一致したら、そのテンプレートが適用されます。xsl:templateテンプレートはXMLのルート(文書全体)に対して必ず必要です。これは下の例のようにルートパス "/" に対して<xsl:template match="/">~</xsl:template match="/"> を定義します。

文法
<xsl:template
name= 修飾名
match = 識別パターン
priority = 優先順位
mode = モード値>
</xsl:template>

xsl:templateのサンプル (1)
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<head>
<title>HTML Tags</title>
</head>

<body>
<h1>HTML Tags</h1>

</body>
</html>
</xsl:template>
</xsl:stylesheet>


 xsl:templateはXMLの一致したパターンに対して置き換えるHTMLを定義します。「<xsl:template>のサンプル (2)」は「XMLのサンプル (1)」の内容の一部(先頭のレコード)を表示するものです。XMLの内容を選択するには、xsl:value-of を使用します。

XMLのサンプル (1)
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="html_tags.xsl"?>
<root>
<tag>
<name>p</name>
<description>Paragraph</description>
</tag>
<tag>
<name>br</name>
<description>Break</description>
</tag>
<tag>
<name>h1</name>
<description>Heading 1</description>
</tag>
<tag>
<name>a</name>
<description>Anchor</description>
</tag>
<tag>
<name>img</name>
<description>Image</description>
</tag>
</root>

xsl:templateのサンプル (2)
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<head>
<title>HTML Tags</title>
</head>

<body>
<h1>HTML Tags</h1>
<xsl:value-of select="root/tag/name"/><br />
<xsl:value-of select="root/tag/description"/><br />
</body>
</html>
</xsl:template>
</xsl:stylesheet>

 「XMLのサンプル (1)」に「<xsl:template>のサンプル (2)」を適用するとブラウザには下のように表示されます。


<xsl:value-of>

 xsl:value-ofはselect属性で指定したノードの内容を取り出します。<xsl:template>のサンプル (2)では最初に見つかったノード root/tag/name と root/tag/description の内容を取り出してHTMLに挿入しています。

文法
<xsl:value-of
select = 式
disable-output-escaping = "yes" | "no" >
</xsl:value-of>

 下の例は属性を含むノードの内容を表示するものです。属性名は@を付けて指定します。

XMLのサンプル (2)
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="colors.xsl"?>
<colors>
 <color name="red">#ff0000</color>
 <color name="green">#00ff00</color>
 <color name="blue">#0000ff</color>
 <color name="black">#000000</color>
 <color name="white">#ffffff</color>
</colors>
属性を含むノードの内容の取り出しサンプル (2)
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<!-- 最上位ノードにマッチ -->
<xsl:template match="/">
<html>
<head>
<title>Web Colors</title>
</head>

<body>
<h1>Web Colors</h1>

<xsl:apply-templates />

</body>
</html>
</xsl:template>

<!-- colorsにマッチ -->
<xsl:template match="colors">
 <!-- テンプレートを適用する。-->
 <xsl:apply-templates />
</xsl:template>

<!-- colorにマッチ -->
<xsl:template match="color">
 <!-- 属性には@を付ける -->
 <xsl:value-of select="@name" />=<xsl:value-of select="." /><br />
</xsl:template>

</xsl:stylesheet>

サンプル


<xsl:apply-templates>

 xsl:apply-templates は、現在の要素または子供の要素のノードにテンプレートを適用します。テンプレートは一致したすべてのノードに適用されるので、「<xsl:template>のサンプル (2)」ではtag要素の最初のノードしか表示されませんでしたが、次の例ではすべてのノードのtag要素の内容が表示されます。

文法
<xsl:apply-templates
select = 式
mode = モード>
</xsl:apply-templates>

xsl:apply-templatesのサンプル
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
<html>
<head>
<title>HTML Tags</title>
</head>

<body>
<h1>HTML Tags</h1>

<!-- テンプレートを適用する。-->
<xsl:apply-templates />

</body>
</html>
</xsl:template>

<!-- rootにマッチ -->
<xsl:template match="root">
 <!-- 次のテンプレートを適用する。-->
 <xsl:apply-templates />
</xsl:template>

<!-- tagにマッチ -->
<xsl:template match="tag">
 <xsl:value-of select="name"/><br />
 <xsl:value-of select="description"/><br />
</xsl:template>

</xsl:stylesheet>

サンプル


<xsl:call-templates>

 xsl:call-templates はテンプレートの名前を指定して直接テンプレートを適用します。下のサンプルは xsl:apply-templates のものとほぼ同じですが、一部が違っています。XMLはxsl:call-templatesを使った別のXSLを使用するため xml-stylesheet の指定が異なっています。また、内容も少し異なります。XSLは /colors にマッチしたら colors テンプレートを呼び出すように変更されています。

文法
<xsl:call-template
name = 識別名>
</xsl:call-template>

XMLのサンプル (3)
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="web_colors2.xsl"?>
<colors>
 <color name="cyan">#00ffff</color>
 <color name="magenta">#ffff00</color>
 <color name="yellow">#ffff00</color>
 <color name="teal">#008080</color>
 <color name="navy">#000080</color>
 <color name="silver">#c0c0c0</color>
</colors>

xsl:call-templatesのサンプル
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<!-- "/colors" ノードにマッチ -->
<xsl:template match="/colors">
  <!-- colors テンプレートを呼び出す。-->
  <xsl:call-template name="colors" />
</xsl:template>

<xsl:template name="colors">
<html>
<head>
<title>Web Colors</title>
</head>

<body>
<h1 style="color:red;">Web Colors</h1>

<!-- テンプレート color を適用。 -->
<xsl:apply-templates select="color" />

</body>
</html>
</xsl:template>


<!-- colorテンプレート。 -->
<xsl:template match="color">
 <!-- 属性には@を付ける -->
 <xsl:value-of select="@name" />=<xsl:value-of select="." /><br />
</xsl:template>

</xsl:stylesheet>

サンプル


<xsl:for-each>

 xsl:for-each はXSLTでループを作るのに使用します。xsl:apply-templates などで暗黙的なループができますが、xsl:for-each は明示的なループを実現します。

文法
<xsl:for-each select = ノード集合を返す式 >
……
処理が繰り返されるテンプレート
……
</xsl:for-each>

XMLのサンプル (4)
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="css_defs.xsl" ?>
<css>
 <style name="color">文字の色</style>
 <style name="background-color">背景の色</style>
 <style name="border-color">境界線の色</style>
 <style name="margin-left">左の余白</style>
</css>

xsl:for-eachのサンプル
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" />

<xsl:template match="/">
 <html>
 <head>
  <meta charset="utf-8" />
  <title>CSS</title>
 </head>
 <body>
  <h1 style="color:red;">CSS</h1>
  <!-- ノード css/style に対して繰り返す。 -->
  <xsl:for-each select="css/style">
   <xsl:value-of select="@name" />:<xsl:value-of select="." /><br />
  </xsl:for-each>
 </body>
 </html>
</xsl:template>

</xsl:stylesheet>

サンプル



<xsl:sort>

 xsl:sort を使うとループの中での並べ替えが簡単に行えます。下のサンプルは、前の xsl:for-each のサンプルに xsl:sort を追加したものです。

文法
<xsl:sort
select = "ソートキーとなる文字列を返す式"
lang = {"ソートキーの言語"}
data-type = {"text"|"number"|"名前空間接頭辞付きの修飾名" }
order = {"ascending"|"descending" }
case-order = {"upper-first"|"lower-first" } />

xsl:sortのサンプル
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" />

<xsl:template match="/">
 <html>
 <head>
  <meta charset="utf-8" />
  <title>CSS</title>
 </head>
 <body>
  <h1 style="color:red;">CSS</h1>
  <!-- ノード css/style に対して繰り返す。 -->
  <xsl:for-each select="css/style">
   <!-- 昇順に並べ替える。 -->
   <xsl:sort select="@name" />
   <xsl:value-of select="@name" />:<xsl:value-of select="." /><br />
  </xsl:for-each>
 </body>
 </html>
</xsl:template>

</xsl:stylesheet>

<xsl:if>

 xsl:if は条件に合うノードのみを抽出します。次のXMLはURL一覧で、このXSLは、XMLのsiteノードの要素 lang が Japaneseのもののみを表示します。

文法
<xsl:if test="式"> テンプレート </xsl:if>

XMLのサンプル (5)
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="sites.xsl" ?>
<sites>
 <site>
   <url>http://www.yahoo.co.jp/</url>
   <name>Yahoo! Japan</name>
   <lang>Japanese</lang>
 </site>
 <site>
   <url>http://www.yahoo.com/</url>
   <name>Yahoo!</name>
   <lang>English</lang>
 </site>
 <site>
   <url>http://www.jazzradio.com/</url>
   <name>JAZZRADIO.com</name>
   <lang>English</lang>
 </site>
</sites>

xsl:ifのサンプル
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" />

<!-- 最上位ノードのとき -->
<xsl:template match="/">
 <html>
 <head>
  <meta charset="utf-8" />
  <title>Sites</title>
 </head>
 <body>
  <h1 style="color:magenta;">Sites</h1>
  <xsl:apply-templates />
 </body>
 </html>
</xsl:template>

<!-- sitesノードならsiteのテンプレートを適用 -->
<xsl:template match="sites">
 <xsl:apply-templates />
</xsl:template>

<!-- siteノードでlangがJapaneseのもののみ表示 -->
<xsl:template match="site">
 <xsl:if test="lang='Japanese'">
   <xsl:value-of select="name" /> (<xsl:value-of select="url" />)<br />
 </xsl:if>
</xsl:template>

</xsl:stylesheet>

サンプル


<xsl:choose>

 xsl:choose は複数の選択肢ごとのノードを選ぶのに使い、xsl:when , xsl:otherwise 要素とともに使用されます。 下のXMLは xsl:if のサンプルとほぼ同じですが、サイト(siteノード)の言語(lang)が3種類になっています。XSLはlangがJapaneseなら赤、Englishなら青で、その他ならでデフォルトの色(通常は黒)でサイトの情報を表示するようにしています。

文法
<xsl:choose>
<xsl:when test="式">
テンプレート
</xsl:when>
……
xsl:when 要素の繰り返し
……
<xsl:otherwise>
テンプレート
</xsl:otherwise>
</xsl:choose>

XMLのサンプル (6)
<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet type="text/xsl" href="sites2.xsl" ?>
<sites>
 <site>
   <url>http://www.yahoo.co.jp/</url>
   <name>Yahoo! Japan</name>
   <lang>Japanese</lang>
 </site>
 <site>
   <url>http://www.yahoo.com/</url>
   <name>Yahoo!</name>
   <lang>English</lang>
 </site>
 <site>
   <url>http://www.jazzradio.com/</url>
   <name>JAZZRADIO.com</name>
   <lang>English</lang>
 </site>
 <site>
   <url>http://www.youku.com/</url>
   <name>youku</name>
   <lang>Chinese</lang>
 </site>
</sites>

xsl:chooseのサンプル
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" />

<!-- 最上位ノードのとき -->
<xsl:template match="/">
 <html>
 <head>
  <meta charset="utf-8" />
  <title>Sites</title>
 </head>
 <body>
  <h1 style="color:magenta;">Sites</h1>
  <xsl:apply-templates />
 </body>
 </html>
</xsl:template>

<!-- sitesノードならsiteのテンプレートを適用 -->
<xsl:template match="sites">
 <xsl:apply-templates />
</xsl:template>

<!-- siteノードでlangがJapaneseなら赤、Englishなら青で表示 -->
<xsl:template match="site">
 <xsl:choose>
  <xsl:when test="lang='Japanese'">
   <p style="color:red;"><xsl:value-of select="name" /> (<xsl:value-of select="url" />)</p>
  </xsl:when>
  <xsl:when test="lang='English'">
   <p style="color:blue;"><xsl:value-of select="name" /> (<xsl:value-of select="url" />)</p>
  </xsl:when>
  <xsl:otherwise>
   <p><xsl:value-of select="name" /> (<xsl:value-of select="url" />)</p>
  </xsl:otherwise>
 </xsl:choose>
</xsl:template>

</xsl:stylesheet>

サンプル


XSLTの要素一覧

要素説明
xsl:apply-importsーバーライドされたテンプレート規則を呼び出す。
xsl:apply-templatesテンプレートを検索して適用する。
xsl:attribute属性ノードを作成し、出力要素に割り当てる。
xsl:attribute-set
xsl:call-templateテンプレートを呼び出す。
xsl:choose複数の選択肢から選ぶ。
xsl:commentコメントを生成。
xsl:copy現在のノードをコピー。
xsl:copy-ofサブツリーをコピー。
xsl:decimal-format10 進形式フォーマット。
xsl:element指定した名前を持つ要素を作成。
xsl:fallback
xsl:for-each要素の繰り返し。
xsl:if判断結果が真の場合テンプレートを適用。
xsl:import他のXSLファイルをインポート。
xsl:include他のXSLファイルをインクルード。
xsl:keyXPath式で key() 関数と共に使用する名前付きキーを宣言。
xsl:messageテキスト メッセージをメッセージ バッファーまたはメッセージ ダイアログ ボックスに送信。
xsl:namespace-alias特定の名前空間に関連付けられているプレフィックスを別のプレフィックスに置き換える。
xsl:number結果ツリーに書式設定された数値を挿入する。
xsl:otherwisexsl:chooseとともに使用する。
xsl:output結果ツリーのシリアル化で使用するオプションを指定する。
xsl:param名前付きパラメーターを宣言する。
xsl:preserve-spaceドキュメント内の空白を保持する。
xsl:processing-instruction
xsl:sortソートを行う。
xsl:strip-space空白を取り除く。
xsl:stylesheetXSLTドキュメントの最初に指定する。
xsl:templateテンプレートを定義する。
xsl:textテキストを生成
xsl:transformxsl:stylesheetと同じ。
xsl:value-of選択されたノードをテキスト値として挿入する。
xsl:variable式の中で連結される値を指定する。
xsl:whenxsl:chooseとともに使用する。
xsl:with-paramテンプレートにパラメーターを渡す。

XSLの関数

 XSLはテンプレートの他、種々の関数も用意されています。次の表はXSL関数の一覧です。

関数説明
node-set current()現在のノードを唯一のメンバーとして持つノード セットを返す。
node-set document(object, node-set?)XSLT スタイル シートから他の XML リソースを取得する。
boolean element-available(string)展開名が命令の名前である場合だけ true を返す。
string format-number(number, string, string?)数字を文字列に変換する。
boolean function-available(string)関数が関数ライブラリ内にある場合は True を返す。
string generate-id(node-set?)ドキュメント順で最初にある node-set 引数内のノードを一意に識別する文字列を返す。
node-set key(name, value)以前 xsl:key ステートメントでマークされた要素を取得する。
object system-property(string)名前で識別されるシステム プロパティの値を表すオブジェクトを返す。
string unparsed-entity-uri(string name)未解析のエンティティの URI を返す。

 

このページの先頭へ戻る