アイデンティティ変換は、ソース データを変更せずに宛先データにコピーする データ変換です。
アイデンティティ変換は、再利用可能な変換ライブラリを作成する上で不可欠なプロセスであると考えられています。基本アイデンティティ変換のバリエーションのライブラリを作成することにより、さまざまなデータ変換フィルターを簡単に維持できます。これらのフィルターは、UNIXシェル パイプに似た形式で連結できます。
再帰変換の例
「再帰によるコピー」では、コードの小さな部分を変更して、入力をフィルタリングまたは更新し、まったく新しい異なる出力を生成することができます。「再帰による同一性」を理解することで、フィルターを理解できます。
XSLTの使用
最も頻繁に引用される恒等変換の例(XSLTバージョン1.0の場合)は、XSLTで表現される「copy.xsl」変換です。この変換では、xsl:copyコマンド[1]を使用して恒等変換を実行します。
<xsl:stylesheet version= "1.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" > <xsl:template match= "@*|node()" > <xsl:copy> <xsl:apply-templates select= "@*|node()" /> </xsl:copy> </xsl:template> </xsl:stylesheet>
このテンプレートは、すべての属性 ( @* ) とその他のノード ( node() ) を一致させ、一致した各ノードをコピーし、次に、コンテキスト ノードのすべての属性と子ノードに恒等変換を適用することによって機能します。これにより、要素ツリーが再帰的に下降し、XPathデータ モデルで重要と見なされる情報の制限内で、元のファイルで見つかったのと同じ構造ですべての構造が出力されます。node() は、要素だけでなく、テキスト、処理命令、ルート、コメントも一致するため、すべての XML ノードがコピーされます。
恒等変換のより明示的なバージョンは次のとおりです。
<xsl:stylesheet version= "1.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" > <xsl:template match= "@*|*|processing-instruction()|comment()" > <xsl:copy> <xsl:apply-templates select= "*|@*|text()|processing-instruction()|comment()" /> </xsl:copy> </xsl:template> </xsl:stylesheet>
このバージョンは最初のバージョンと同等ですが、コピーする XML ノードの種類を明示的に列挙します。どちらのバージョンも、ほとんどの XML の使用には不要なデータ (コメントなど) をコピーします。
3.0 の
XSLT 3.0 [2]では、xsl:mode明示的なテンプレートルールとして実装するのではなく、恒等変換を宣言できるようにする命令
のon-no-match属性が指定されています。具体的には、
<xsl:stylesheet version= "3.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" > <xsl:mode on-no-match= "shallow-copy" /> </xsl:stylesheet>
は、本質的には以前のテンプレートルールと同等です。詳細については、XSLT 3.0標準のshallow-copy [3]の説明を参照してください。
最後に、CDATA セクションの使用や属性の順序などのマークアップの詳細は、XPath データ モデルの一部ではないため、出力で必ずしも保持されるわけではないことに注意してください。出力で CDATA マークアップを表示するには、恒等変換テンプレート (恒等変換テンプレート自体ではないxsl:output) を含む XSLT スタイルシートで、と呼ばれる属性を使用する必要がありますcdata-section-elements。
cdata-section-elementsCDATAセクションを使用してテキストノードの子要素を出力する要素の名前のリストを指定します。
[1]
例:
<xsl:出力方法 = "xml"エンコーディング = "utf-8" cdata-section-elements = "要素名-1 要素名-2" />
XQueryの使用
XQuery では再帰関数を定義できます。次の XQuery 関数の例では、入力を変更せずに直接出力にコピーします。
関数local:copy ( $ element as element ())を宣言します。 { element { node-name ( $ element )} { $ element / @* , for $ child in $ element / node () return if ( $ child instance of element ()) then local:copy ( $ child ) else $ child } };
同じ機能は、typeswitch スタイルの変換を使用しても実現できます。
xqueryバージョン"1.0" ;
(: 入力を変更せずに出力にコピーします :)
関数local :copy ( $ input as item () * ) as item () * { for $ node in $ input return typeswitch ( $ node ) case document-node () return document { local:copy ( $ node / node ()) } case element () return element { name ( $ node )} {
(: この要素の各属性を出力します :)
for $ att in $ node / @* return attribute { name ( $ att )} { $ att } , (: この要素のすべてのサブ要素を再帰的に出力します :) for $ child in $ node return local:copy ( $ child / node ())
}
(: それ以外の場合はそのまま渡します。text()、コメント、PI に使用されます :)デフォルトでは$ nodeを返します};
特別な処理が必要な要素に case ステートメントを追加するだけで簡単に変更できるため、typeswitch 変換が好まれる場合があります。
非再帰変換
2 つのシンプルでわかりやすい「すべてコピー」変換。
XSLTの使用
<xsl:stylesheet version= "1.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform" > <xsl:template match= "/" > <xsl:copy-of select= "." /> </xsl:template> </xsl:stylesheet>
XProcの使用
<p:pipeline name= "パイプライン" xmlns:p= "http://www.w3.org/ns/xproc" > <p:identity/> </p:pipeline>
ここで、 XProcアイデンティティに関する重要な注意点の 1 つは、この例のように 1 つのドキュメントまたはドキュメントのシーケンスを入力として受け取ることができることです。
より複雑な例
一般的に、恒等変換はローカルな変更を加えるための基盤として使用されます。
名前付き要素の変換を削除
XSLTの使用
アイデンティティ変換は、特定のノードを除くすべてを入力ツリーから出力ツリーにコピーするように変更できます。たとえば、次の例では、社会保障番号を除くすべてを入力から出力にコピーします。
<xsl:template一致 = "@*|node()" > <xsl:copy> <xsl:apply-templates選択 = "@*|node()" /> </xsl:copy> </xsl:template>
<!-- すべての社会保障番号を削除します -->
<xsl:template match= "PersonSSNID" />
XQueryの使用
関数local:copy-filter-elements ( $ element as element (), $ element-name as xs:string * ) をelement ()として宣言します{ element { node-name ( $ element ) } { $ element / @* , for $ child in $ element / node ()[ not ( name (.) = $ element-name )] return if ( $ child instance of element ()) then local:copy-filter-elements ( $ child , $ element-name ) else $ child } };
これを呼び出すには、以下を追加します。
$フィルタリングされた出力:= local:copy-filter-elements ( $入力、'PersonSSNID' )
XProcの使用
<p:pipeline name= "パイプライン" xmlns:p= "http://www.w3.org/ns/xproc" > <p:identity/> <p:delete match= "PersonSSNID" /> </p:pipeline>
参照
さらに読む
- XSLT Cookbook、O'Reilly Media, Inc.、2002 年 12 月 1 日、Sal Mangano 著、ISBN 0-596-00372-2
- Priscilla Walmsley、XQuery、O'Reilly Media, Inc.、第 8 章 関数 – 再帰関数 – 109 ページ
参考文献
- ^ ab W3.org - XSL 変換バージョン 1.0 - コピー
- ^ W3.org - XSL 変換バージョン 3.0
- ^ W3.org - XSL 変換バージョン 3.0 - 組み込みテンプレート: 浅いコピー
