XSLT(拡張スタイルシート言語変換、XSL(T) [ 1 ] [ 2 ] [ 3 ] [ 4 ]または XSL-T [ 5 ]とも呼ばれる)は、テキストをテキストに変換するドメイン固有の宣言型プログラミング[ 6 ]言語です。
これは元々、XMLドキュメントを他の XML ドキュメント[ 7 ]や、Web ページ用のHTML、プレーン テキスト、XSL フォーマット オブジェクトなどの他の形式に変換するために設計されました。これらの形式は、その後、 PDF、PostScript、PNGなどの形式に変換できます。[ 8 ] JSON およびプレーン テキスト変換のサポートは、XSLT 1.0 仕様の後のアップデートで追加されました。
XSLT 3.0の実装は、Java、.NET、C/C++、Python、PHP、NodeJSをサポートしています。また、XSLT 3.0のJavaScriptライブラリをWebブラウザ内でホストすることも可能です。
現代のウェブ ブラウザには、XSLT 1.0 のネイティブ サポートも含まれています。[ 9 ]しかし、使用率は常にかなり低く、減少傾向にあります。2013 年に Web サイト全体の 0.02% で使用され、2025 年に 0.001% になると予測されています。 [ 10 ]長年にわたり、XSLT には深刻なセキュリティ脆弱性が繰り返し存在していました。そのため、Google は2013 年と 2015 年にChromiumから削除することを計画しました。 [ 11 ]現在、Chromium、Firefox、WebKitは、2026 年末までにブラウザのセキュリティを強化するために、ネイティブ XSLT サポートを削除することを計画しています。 [ 12 ] [ 13 ]現在では、ネイティブ サポートなしでも新しいバージョンの XSLT をサポートするためにポリフィルを使用できます。[ 14 ] [ 15 ]
XSLT ドキュメント変換は、XML ドキュメントを新しいドキュメント (通常は XML ですが、プレーンテキストなどの他の形式もサポートされています) に変換する方法を指定します。[ 16 ]通常、入力ドキュメントは XML ファイルですが、リレーショナル データベーステーブルや地理情報システムなど、プロセッサがXQuery および XPath データ モデルを構築できるものであれば何でも使用できます。[ 7 ]
XSLTは元々XML変換のための特殊目的言語として設計されたが、チューリング完全であるため、理論的には任意の計算が可能である。[ 17 ]
XSLTはしばしばXSLと曖昧に呼ばれます。これは、XSL-FOがXSLTを使用していること、初期のXSLT専用のMIMEタイプ[ 18 ]text/xsl、より一般的なファイル名拡張子[ 19 ] [ 20 ]、および公式リソースで名前空間識別子として使用されていること(XSLTドキュメント全体のすべてのタグにプレフィックスが付けられる)[ 21 ]によるものです。SA Pは自社のWebサイトで「.xsl言語」とさえ呼んでいます[ 20 ]。例えば、SaxonJS WebサイトのFirefoxのネットワークマネージャでは、.xslxsl:xsl:MIMEタイプ.xslを持つXSLTコードを含むファイルを確認できます。application/octet-stream
XSLTは関数型言語[ 22 ]やSNOBOLやAWKのようなテキストベースのパターンマッチング言語の影響を受けています。その最も直接的な前身はDSSSLで、XSLTがXMLに対して行ったことをSGMLに対して行いました[ 23 ] 。

XSLT プロセッサは、1 つ以上の XML ソース ドキュメントと 1 つ以上の XSLT スタイル シートを受け取り、それらを処理して 1 つ以上の出力ドキュメントを生成します。[ 32 ] [ 33 ] Cのような広く実装されている命令型プログラミング言語とは対照的に、XSLT は宣言型です。[ 34 ]基本的な処理パラダイムはパターン マッチングです。[ 35 ]ステートフル 環境で実行する命令型の一連のアクションを列挙するのではなく、テンプレート ルールは、プロセッサが特定の 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は、例えばリレーショナル結合を実行する場合など、データ処理に優れています。[ 36 ]
要素はオプションで属性 を受け取ることができ、これにより、結果として得られる出力のメディア タイプ(または MIME タイプ)を設定できます。たとえば、 です。 XSLT 1.0 勧告では、より一般的な属性タイプと[ 37 ]を推奨しています。これは、長い間 XSLT に登録されたメディア タイプがなかったためです。この間[ 18 ]が事実上の標準となりました。 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[ 38 ]、その後インターネット割り当て番号機関に登録された[ 39 ]。
XSLT の 1.0 以前の作業ドラフトではtext/xsl埋め込み例で使用されており、このタイプは Microsoft によって Internet Explorer [ 40 ]および 2012 年頃の MSXML で実装され、引き続き推進されました。また、xml-stylesheet他のブラウザの処理命令でも広く認識されています。そのため、実際には、この処理命令を使用してブラウザでの変換を制御したいユーザーは、この未登録のメディアタイプを使用せざるを得ませんでした。[ 41 ]
これらの例では、以下の入力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 に追加できます。[ 42 ]
<?xml-stylesheet href="example2.xsl" type="text/xsl" ?>この例では、text/xslW3C 仕様[ 42 ]によれば技術的には正しくありません(仕様では、タイプは であるべきだとされていますapplication/xslt+xml) が、2009 年時点ではブラウザ全体で広くサポートされている唯一のメディア タイプであり、2021 年でも状況は変わっていません。
XSLTは、学習曲線が急峻であること[ 43 ] 、可読性が低いこと[ 44 ] 、処理性能が低いこと[ 45 ] [ 46 ] 、実装が時代遅れであること[ 47 ]などが批判されている。 さらに、一部の開発者は、 XSLTを使用するよりも汎用命令型プログラミング言語を使用してXMLを変換することを好む[ 48 ] [ 49 ] [ 50 ] 。
当時OperaのCTOだったHåkon Wium Lie氏は、2007年のインタビューで、 CSSはXSLTのほとんどのユースケースに対応できると述べている。
XSL [ a ]は、印刷関連の制作ラインでよく使用されるスタイルシート言語です。CSS と XSL は、基本的な書式設定モデルを共有していますが、アプローチは大きく異なります。XSL はプログラミング言語ですが、CSS はそうではありません。両方の言語が必要なのでしょうか?私は、CSS で XSL のほとんどのユースケースに対応できると考えています。例えば、プリンスは、CSS で素晴らしい印刷物を作成できることを示しました。これに異議を唱え、場合によってはプログラミング言語が必要だと主張する人もいるでしょう。
—ホーコン・ウィウム・リー、「ウェブ標準の未来:W3Cの危機について」、https://www.heise.de/ct/Redaktion/heb/w3c/lie_english.html
msxsl.exe。[ 63 ] .NET ランタイムには、ライブラリに別の組み込み XSLT プロセッサが含まれていますSystem.Xml.Xsl。属性 version='1.0' は XSL(T) 仕様のバージョンを指定します。
Neben CSS は XSL bzw です。 XSLT は、ブラウザの相対的な XML データを管理します。 XSL(T) は、HTML umzuwandeln の要素の XML 要素の機能と構文を説明します。
Als Alternative kann ein so genannter XSL(T)-Prozessor benutzt werden。 Beim XSL(T) プロセッサは、XSL スタイルシートと XML ドキュメントを作成し、スタイルシートを作成し、新しいドキュメントを作成します。
[2000年8月21日] "Inside XSL-T." Michael Classen著。WebReference.comより(2000年8月)。['XMLが話題になっているが、実際には多くの重労働はXSLで行われている。拡張スタイルシート言語変換(Extensible Style Sheet Language Transformation)は、一見すると長ったらしい名前ですが、XML ドキュメントを HTML などの表示言語に変換するための鍵となるものです。XSL は当初、次の 2 つの問題を解決するために考案されました。(1) XML ドキュメントを別の形式に変換する。(2) XML ドキュメントを、プリンタやブラウザーなどのページ指向デバイスに表示するための形式にする。その後、低解像度の画面表示から高解像度の印刷やコピーまで、さまざまな要件を満たす方法で 2 番目の問題を解決することは困難であることが判明しました。さらに、画面の形式は現在カスケードスタイルシート (CSS) で行われているため、別の方法への関心はほとんどありませんでした。そこで、ワールドワイドウェブ委員会 (W3C) は、2 つのタスクを XSL 変換 (XSL-T) と XSL フォーマットオブジェクト (XSL-FO) という別々のサブ標準に分割することを決定しました。XSL-T は昨年 11 月に公式勧告となりましたが、XSL-FO はまだ開発中です。XSLT で表現される変換は、ソースツリーを結果ツリーに変換するためのルールを記述します。変換は、パターンとテンプレートを関連付けることによって実現されます。パターンがソースツリー内の要素に一致するたびに、テンプレートを使用して結果ツリーの一部が作成されます。結果ツリーはソースツリーとは別個のものであり、その構造は完全に異なる場合があります。結果ツリーの構築において、ソースツリーの要素はフィルタリングおよび並べ替えが可能であり、新しい要素を追加することもできます。XSLTで表現された変換は、XSLTがHTMLやWMLなどの表示言語に変換する場合、スタイルシートと呼ばれます。
XML変換に用いられる主要なDSLは、パターンマッチングとテンプレートインスタンス化に基づく宣言型言語であるXSLT [18]である。[6ページより]
Google は、XSLT のサポートを何度か中止しようと試みたことがある。2013 年、Adam Barth は Blink 開発リストに、ブラウザ エンジンから XSLT を非推奨にして削除する意向を通知した。Barth は、XSLT の組み込みは「セキュリティ上の脆弱性につながるほどの複雑さ」を加え、XSLT のサポートを中止すれば、Blink の libxml への依存をなくすのに役立つと主張した。最終的に、この提案は保留となった。Dominic Cooney は 2015 年に Chrome から XSLT を非推奨にして削除しようと試みた。多くの議論の後、Rick Byers は Chrome の API オーナーが会合を開き、最終的には Blink から XSLT を削除したいと合意したと返答した。しかし、これまでの経験から、チームは慎重かつ計画的に「ユーザーと開発者の負担を最小限に抑える」ことが重要だと学んでいた。バイアーズは、代替案の実例や最長2年間の廃止スケジュールなど、そのような計画に必要な要素のリストを提示した。クーニーがそのような計画を提出したかどうかは不明だが、10年経った今でもChromeにはlibxsltが同梱され、XSLT 1.0をサポートしている。
たとえば、セキュリティ監査やバグトラッカーは、これらのパーサーに重大な脆弱性(例:libxsltのCVE-2025-7425とCVE-2022-22834)を繰り返し特定しています。クライアント側のXSLTは現在、ニッチでほとんど使用されていない機能であるため、これらのライブラリはコアJavaScriptエンジンよりもはるかにメンテナンスやセキュリティの精査を受けていませんが、信頼できないWebコンテンツを処理するための直接的で強力な攻撃対象となっています。
は、ブラウザまたはNode.js上で動作する高性能なXSLT 3.0プロセッサです。最新のW3C仕様(特にXSLT 3.0とXPath 3.1)に準拠しており、現代のWebアプリケーションのニーズを満たすように設計された拡張機能も備えています。
このポリフィルは、libxslt および libxml2 C ライブラリの WebAssembly ポートによって動作し、標準に準拠した XSLT 1.0 エンジンを提供します。
未登録のメディア タイプ「text/xsl」を使用して記述されることがほとんどです。
.xsl と .xslt はどちらも有効です。.xsl 拡張子は古く、エンタープライズ システム (SAP、Oracle、IBM DataPower) でより一般的です。.xslt 拡張子はより明示的です。Saxon はどちらでも受け入れます。XSLT Playground は、名前に関係なく、あらゆるコンテンツを受け入れます。
明細書は .xsl 言語で記述されており、以下の情報は、この言語に精通している管理者向けにその一部を説明します。
:複数の結果ドキュメント
は、独特の宣言的な特徴を持つ非常に特殊な言語です。
サーバーは、ソースとスタイルシートの両方を XML MIME タイプ (text/xml または application/xml) で送信する必要があります。
の主な批判の 1 つは、学習曲線が急峻であることです。
構文は読みにくく、ルールベースのプログラミングは多くのプログラマーにとって馴染みのない概念です。
スタイルシートの処理には、かなりの CPU リソースが消費されます。スケーラブルなアプリケーションでは、必要なスループットを実現するために、変換結果をキャッシュする必要がある場合がよくあります。スループットを向上させるもう 1 つのオプションは、XSLT コンパイラを使用することです。たとえば、XALAN に含まれる XSLT コンパイラは、XSLT スタイルシートを一連の Java クラスに変換します。
しかし、実際にはXSLTにはオーバーヘッドとアーキテクチャ上の制約があり、後々大きな問題を引き起こします。 ... XSLTは、より直接的なソリューションでは決して遭遇しないような新たなパフォーマンスの問題を生み出します。
XSLT の採用が直面している問題の一つは、古い実装をアップグレードするのが難しいことです。Java には Xalan が付属しています。Xalan は 2000 年に Java に初めて組み込まれて以来改良されておらず、1999 年に標準化された最初のバージョンの XSLT を今でも使用しています。Linux ベースの libxslt プロセッサも同様です。Linux プラットフォーム向けの優れた実装ではありますが、2000 年代初頭に作成されて以来アップグレードされていません。
私たちのアプローチ
私たちは、1) XML値とXML変換のための非常に柔軟な操作を既存の高水準言語に完全に統合し、2) 変換の型安全性を静的に保証する技術Xactを紹介します。Webサービスの開発ですでに広く使用されているJavaをベースに構築することを選択しました。汎用言語を使用することで、XML操作を、たとえばデータベースへのアクセスやインターネット上での通信などの他の機能と組み合わせることができます。[7ページより]
何かを達成するために必要なXSLTを少し試してみた後、同じことを行うには手続き型コードを使用する方が簡単でシンプルだと結論付けました。
この演習から私が得た結論は、XML 変換に Ruby を使用する方が XSLT を使用するよりもはるかに簡単だということでした。