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文書の形式をとる。


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


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

変換前の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 はテンプレートの関数を再帰的な形で定義ができる純粋関数型言語でもある。

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

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


```xslt
<?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>
      
      <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のみを認識するものも多い。

## 脚注

### 注釈

### 出典

## 関連項目
*コンピュータ言語
**プログラミング言語
***宣言型言語
****関数型言語
**変換言語

## 外部リンク
* 実装
** Xalan-Java
** Xalan-C++
** libxslt the XSLT C library for Gnome
** Sablotron
** SAXON by Michael Kay
** XT by James Clark
** [XSLT for MSXML | Microsoft Docs](https://learn.microsoft.com/en-us/previous-versions/windows/desktop/ms759204(v=vs.85))
*** [MS-XSLT: Microsoft XSLTransformations (XSLT) Standards Support Document]
**  MozillaはXSLTにネイティブ対応
** X-SmilesはXSLTにネイティブ対応している
** &lt;oXygen/&gt; XSLT editor and debugger
* 仕様書
** XSLT 1.0 W3C 勧告
*** 
** XSLT 2.0 W3C 勧告
** XSLT 3.0 W3C 勧告
** XSLTチュートリアル (ドイツ語)
** XSLT 2.0参照 (ドイツ語)
** XSLTとXPathリファレンス (ドイツ語)