XSL Transformations

XSL変換（、XSLT）は、W3Cにより標準化されたXML文書の変換用言語である。3つの仕様から成るXSLのうちの、ひとつの仕様である。XSLT の仕様はジェームズ・クラークを中心とした人々が設計した。XSLT と XSL-FO はDSSSLをもとにして設計された。

XSLT 1.0 は1999年11月23日にW3C勧告となり、2007年には JIS X 4169 としてJIS規格へ翻訳された。XSLT 2.0 は2007年1月23日に、3.0は2017年6月8日にW3C勧告となった。

XSLTはXML形式の文書を変換する。 による選択と検索にもとづき、XML文書全体または文書の一部に対して変換を行い、XML として出力する他、XML（整形式）ではないその他任意のテキスト形式としても出力できる。

例としては次のような応用がある。
一定フォーマットのHTML用の、文書型宣言・ヘッダ情報の追加
テキストの移動
テキストのソート
変換の指定は関数型言語として見ることもでき、実のところチューリング完全であるため、コンピュータ・プログラムを書くようにしてどんな応用も可能である。裏返せば、その機能を十分に発揮させるためには利用者に通常のプログラミングと同様の能力と作業が必要であり、しばしばXMLに対して持たれている「プログラミングが不要」という期待を裏切るものではある。

変換の対象となるXML文書は木構造であり、XSLTによる変換は宣言的に指定される。つまり、XSLTプログラムは、変換をどう行うべきか指定する規則をいくつか集めたものからなり、この規則を再帰的に適用することによって変換を行う。

XSLT処理系はまずどの規則が適用できるかチェックし、優先順にもとづいて該当する変換を行う。

XSLTプログラムは、以下のようにXML文書の形式をとる。

<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 ...
</xsl:stylesheet>

データ変換
XML 形式のデータを様々な形式のデータに変換できる。ここではその例を示す。

変換前のXML

<?xml version="1.0" ?>
<persons>
 <person username="JS1">
 <name>John</name>
 <family-name>Smith</family-name>
 </person>
 <person username="MI1">
 <name>Morka</name>
 <family-name>Ismincius</family-name>
 </person>
</persons>

変換後の形式XSLTコード変換結果XML<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 <xsl:output method="xml" indent="yes"/>

 <xsl:template match="/persons">
 <root>
 <xsl:apply-templates select="person"/>
 </root>
 </xsl:template>

 <xsl:template match="person">
 <name username="{@username}">
 <xsl:value-of select="name" />
 </name>
 </xsl:template>

</xsl:stylesheet><?xml version="1.0" encoding="UTF-8"?>
<root>
 <name username="JS1">John</name>
 <name username="MI1">Morka</name>
</root>XHTML<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
 version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns="http://www.w3.org/1999/xhtml">

 <xsl:output method="xml" indent="yes" encoding="UTF-8"/>

 <xsl:template match="/persons">
 <html>
 <head> <title>Testing XML Example</title> </head>
 <body>
 <h1>Persons</h1>
 <ul>
 <xsl:apply-templates select="person">
 <xsl:sort select="family-name" />
 </xsl:apply-templates>
 </ul>
 </body>
 </html>
 </xsl:template>

 <xsl:template match="person">
 <li>
 <xsl:value-of select="family-name"/><xsl:text>, </xsl:text><xsl:value-of select="name"/>
 </li>
 </xsl:template>

</xsl:stylesheet><?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
 <head> <title>Testing XML Example</title> </head>
 <body>
 <h1>Persons</h1>
 <ul>
 <li>Ismincius, Morka</li>
 <li>Smith, John</li>
 </ul>
 </body>
</html>CSV<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
 version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

 <xsl:output method="text" encoding="UTF-8"/>

 <xsl:template match="/persons">
 <xsl:apply-templates select="person" />
 </xsl:template>

 <xsl:template match="person">
 <xsl:value-of select="@username" />
 <xsl:text>,</xsl:text>
 <xsl:apply-templates select="*" />
 </xsl:template>

 <xsl:template match="name">
 <xsl:value-of select="." />
 <xsl:text>,</xsl:text>
 </xsl:template>

 <xsl:template match="family-name">
 <xsl:value-of select="." />
 <xsl:text>
</xsl:text>
 </xsl:template>

</xsl:stylesheet> JS1,John,Smith
 MI1,Morka,Ismincius

テンプレート関数
XSLT はテンプレートの関数を再帰的な形で定義ができる純粋関数型言語でもある。

下記のものはテンプレート関数 String_replaceAllである。これは、パラメーター this で指定した文字列中にある、パラメーター substring で指定した部分文字列をすべて、パラメーター replacement で指定する文字列に置換した文字列を返す関数。これの例から以下の点が分かる。

テンプレート関数の定義の仕方（xsl:template、xsl:param）
引数の値の参照の仕方（$引数名）
条件分けの仕方（xsl:if、xsl:choose）
XSLT関数（not、contains、substring-before、substring-after）
XSLT関数の使い方（<xsl:value-of select="XSLT関数 (引数...)" />）
定義されたテンプレート関数の呼び出し方（xsl:call-template、xsl:with-param：再帰呼び出しの箇所）

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template name="String_replaceAll">
 <!-- 引数 -->
 <xsl:param name="this" select="''" />
 <xsl:param name="substring" />
 <xsl:param name="replacement" />

 <xsl:if test="not ($this='')">
 <xsl:choose>
 <!-- this に substring が含まれる場合の値 -->
 <xsl:when test="contains ($this, $substring)">
 <xsl:value-of select="substring-before ($this, $substring)" />
 <xsl:copy-of select="$replacement" />
 <xsl:call-template name="String_replaceAll"> <!-- 再帰呼び出し -->
 <xsl:with-param name="this" select="substring-after ($this, $substring)" />
 <xsl:with-param name="substring" select="$substring" />
 <xsl:with-param name="replacement" select="$replacement" />
 </xsl:call-template>
 </xsl:when>

 <!-- そうでない場合の値 -->
 <xsl:otherwise>
 <xsl:value-of select="$this" />
 </xsl:otherwise>
 </xsl:choose>
 </xsl:if>
</xsl:template>
</xsl:stylesheet> 

 メディア型 
XSLTのメディア型は、「application/xslt+xml」としてに登録されており、「application/xslt+xml」または「application/xml」が望ましいMIMEタイプである。しかし、Internet Explorerなど一部のユーザーエージェントには、これらのMIMEではXSLTを認識しないものや、「text/xsl」などの独自に定めたMIMEのみを認識するものも多い。