XSLT(Extensible Stylesheet Language Transformations )は、元々はXMLドキュメントを他のXMLドキュメント[ 1 ]や、Webページ用のHTML、プレーンテキスト、XSLフォーマットオブジェクトなどの他の形式に変換する ために設計された言語です。これらの形式は、その後、 PDF、PostScript、PNGなどの形式に変換できます[ 2 ]。JSONとプレーンテキストの変換のサポートは、XSLT 1.0仕様の後のアップデートで追加されました。
XSLT 3.0 の実装は、Java、.NET、C/C++、Python、PHP、NodeJS をサポートしています。XSLT 3.0 JavaScript ライブラリは、Web ブラウザ内でホストすることもできます。最新の Web ブラウザには、XSLT 1.0 のネイティブ サポートも含まれています。[ 3 ]より優れたテクノロジーにより、ブラウザでは XSLT は廃止されました。Google Chrome は、ブラウザのセキュリティを強化するために、XSLT の実装を削除します。[ 4 ] [ 5 ]
XSLT ドキュメント変換は、XML ドキュメントを新しいドキュメント (通常は XML ですが、プレーンテキストなどの他の形式もサポートされています) に変換する方法を指定します。[ 6 ]通常、入力ドキュメントは XML ファイルですが、リレーショナル データベーステーブルや地理情報システムなど、プロセッサがXQuery および XPath データ モデルを構築できるものであれば何でも使用できます。[ 1 ]
XSLTは元々XML変換のための特殊目的言語として設計されたが、チューリング完全であるため、理論的には任意の計算が可能である。[ 7 ]
XSLTは関数型言語[ 8 ]やSNOBOLやAWKのようなテキストベースのパターンマッチング言語の影響を受けています。その最も直接的な前身はDSSSLで、 XSLTがXMLに対して行ったことをSGMLに対して行いました[ 9 ]。

XSLT プロセッサは、1 つ以上の XML ソース ドキュメントと 1 つ以上の XSLT スタイル シートを受け取り、それらを処理して 1 つ以上の出力ドキュメントを生成します。[ 18 ] [ 19 ] Cのような広く実装されている命令型プログラミング言語とは対照的に、XSLT は宣言型です。[ 20 ]基本的な処理パラダイムはパターン マッチングです。[ 21 ]ステートフル 環境で実行する命令型の一連のアクションを列挙するのではなく、テンプレート ルールは、プロセッサが特定の XPath ライク パターンに一致するノードに遭遇した場合に、そのノードをどのように処理するかを定義するだけであり、テンプレートの内容は、プロセッサの出力の基礎となる結果ツリーという評価形式を直接表す関数式で構成されています。
一般的なプロセッサは、次のように動作します。まず、スタイルシートが既に読み込まれて準備されていることを前提として、プロセッサは入力XMLドキュメントからソースツリーを構築します。次に、ソースツリーのルートノードを処理し、スタイルシート内でそのノードに最もよく一致するテンプレートを見つけて、テンプレートの内容を評価します。各テンプレート内の命令は、通常、プロセッサに対して、結果ツリーにノードを作成するか、ルートノードと同様の方法でソースツリー内の他のノードを処理するように指示します。最後に、結果ツリーはXMLまたはHTMLテキストとしてシリアル化されます。
XSLTはXPathを使用して、ソースドキュメントツリーのサブセットを識別し、計算を実行します。XPathはさまざまな関数も提供しており、XSLT自体がそれらをさらに拡張します。
XSLT 1.0 は XPath 1.0 を使用し、XSLT 2.0 は XPath 2.0 を使用します。XSLT 3.0 は XPath 3.0 または 3.1 のどちらでも動作します。1.0 と 2.0 の場合、XSLT と XPath の仕様は同日に公開されました。しかし、3.0 では両者は同期されなくなりました。XPath 3.0 は 2014 年 4 月に勧告となり、続いて XPath 3.1 が 2017 年 2 月に勧告となり、XSLT 3.0 は 2017 年 6 月に勧告となりました。
XSLTの機能はXQueryの機能と重複しており、XQueryは当初、大規模なXML文書コレクションのためのクエリ言語として構想された。
XSLT 2.0とXQuery 1.0の標準規格は、W3C内の別々のワーキンググループによって開発されましたが、適切な場合には共通のアプローチを確保するために協力して作業を進めました。両規格は同じデータモデル、型システム、関数ライブラリを共有しており、どちらもXPath 2.0をサブ言語として含んでいます。
しかし、この2つの言語は異なる伝統に根ざしており、異なるコミュニティのニーズに応えるものです。XSLTは主にスタイルシート言語として構想され、その主な目的は、画面上、Web上(Webテンプレート言語として)、または紙上で、人間が読めるようにXMLをレンダリングすることでした。一方、XQueryは主にSQLの伝統に則ったデータベースクエリ言語として構想されました。
2つの言語は異なるコミュニティで生まれたため、XSLTはより柔軟な構造を持つナラティブ文書の処理に優れており、XQueryは、例えばリレーショナル結合を実行する場合など、データ処理に優れています。[ 22 ]
要素はオプションで属性 を受け取ることができ、これにより、結果として得られる出力のメディア タイプ(または MIME タイプ)を設定できます。たとえば、 です。 XSLT 1.0 勧告では、より一般的な属性タイプ と を推奨しています。これは、長い間 XSLT に登録されたメディア タイプがなかったためです。この間、 が事実上の標準となりました。 XSLT 1.0 では、値の使用方法は規定されていませんでした。<output>media-type<xsl:output output="xml" media-type="application/xml"/>text/xmlapplication/xmltext/xslmedia-type
XSLT 2.0のリリースに伴い、W3Cは2007年にMIMEメディアタイプの登録を推奨しapplication/xslt+xml[ 23 ]、その後インターネット割り当て番号機関に登録された[ 24 ]。
XSLT の 1.0 以前の作業ドラフトではtext/xsl埋め込み例で使用されており、このタイプは Microsoft によって Internet Explorer [ 25 ]および 2012 年頃の MSXML で実装され、引き続き推奨されました。また、xml-stylesheet他のブラウザの処理命令でも広く認識されています。そのため、実際には、この処理命令を使用してブラウザでの変換を制御したいユーザーは、この未登録のメディアタイプを使用せざるを得ませんでした。[ 26 ]
これらの例では、以下の入力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文書となる。
<?xml version="1.0" encoding="UTF-8"?> <root> <name username= "JS1" > John </name> <name username= "MI1" > Morka </name> </root>以下のサンプルXSLTファイルを処理しています。
<?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> XML のテスト例</title> </head> <body> <h1>人物</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入力ファイルを使用すると、以下のXHTMLが生成されます(読みやすさを考慮して、ここでは空白を調整しています)。
<?xml version="1.0" encoding="UTF-8"?> <html xmlns= "http://www.w3.org/1999/xhtml" > <head> <title> XML の例のテスト</title> </head> <body> <h1>人</h1> <ul> <li> Ismincius, Morka </li> <li> Smith, John </li> </ul> </body> </html>このXHTMLをWebブラウザで表示すると、以下の出力が生成されます。

ウェブブラウザが表示中の XML ドキュメントに XSL 変換を適用できるようにするには、XML スタイルシート処理命令を XML に挿入することができます。たとえば、上記の例 2 のスタイルシートが「example2.xsl」として利用可能であれば、次の命令を元の入力 XML に追加できます。[ 27 ]
<?xml-stylesheet href="example2.xsl" type="text/xsl" ?>この例では、text/xslW3C 仕様[ 27 ]によれば技術的には正しくありません(仕様では、タイプは であるべきだとされていますapplication/xslt+xml) が、2009 年時点ではブラウザ全体で広くサポートされている唯一のメディア タイプであり、2021 年でも状況は変わっていません。
msxsl.exe。[ 40 ] .NET ランタイムには、ライブラリに別の組み込み XSLT プロセッサが含まれていますSystem.Xml.Xsl。初期の XSLT プロセッサのほとんどはインタプリタでした。最近では、移植可能な中間言語 ( Java バイトコードや .NET共通中間言語など) をターゲットとしてコード生成がますます一般的になっています。しかし、インタプリタ製品でも、一般的には分析フェーズと実行フェーズが分離されており、最適化された式ツリーをメモリ内に作成して再利用し、複数の変換を実行できます。これにより、同じ変換がさまざまなソース ドキュメントに毎秒何度も適用されるオンライン出版アプリケーションで、パフォーマンスが大幅に向上します。[ 43 ]この分離は、XSLT 処理 API ( JAXPなど) の設計にも反映されています。
初期の XSLT プロセッサには最適化がほとんどありませんでした。スタイルシート ドキュメントはドキュメント オブジェクト モデルに読み込まれ、プロセッサはそれらを直接処理していました。XPathエンジンも最適化されていませんでした。しかし、XSLT プロセッサは、関数型プログラミング言語やデータベース クエリ言語に見られるような最適化技術をますます使用するようになっています。例えば、式ツリーの静的書き換え (ループから計算を移動するため) や、中間結果のメモリ フットプリントを削減するための遅延パイプライン評価(すべての部分式を完全に評価することなく、プロセッサが式を評価できる場合に「早期終了」を可能にする) などです。多くのプロセッサは、汎用 DOM 実装よりもfollowing-sibling::*[1](空間と時間の両面で) はるかに効率的なツリー表現も使用しています[ 44 ] 。
2014年6月、デビー・ロケットとマイケル・ケイは、 XSLTプロセッサ向けのオープンソースのベンチマークフレームワークであるXT-Speedoを発表した。[ 45 ]
:複数の結果ドキュメント
は、独特の宣言的な特徴を持つ非常に特殊な言語です。
{{cite journal}}: CS1メンテナンス: DOIは2025年7月現在非アクティブです(リンク){{cite journal}}: CS1メンテナンス: DOIは2025年7月現在非アクティブです(リンク)