keys を使用した完全で効率的な短い変換:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kBibById" match="bib" use="@id"/>
<xsl:template match="node()|@*" name="identity">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="link">
<xsl:call-template name="identity"/>
<year><xsl:value-of select="key('kBibById', @id)"/></year>
</xsl:template>
</xsl:stylesheet>
この変換が提供された XML ドキュメントに適用されると、次のようになります。
<comp>
<alink>
<link id="0003"/>
<link id="0001"/>
<link id="0002"/>
</alink>
<bibsection>
<bib id="0001">2007</bib>
<bib id="0002">2008</bib>
<bib id="0003">2009</bib>
</bibsection>
</comp>
必要な正しい結果が生成されます。
<comp>
<alink>
<link id="0003"/>
<year>2009</year>
<link id="0001"/>
<year>2007</year>
<link id="0002"/>
<year>2008</year>
</alink>
<bibsection>
<bib id="0001">2007</bib>
<bib id="0002">2008</bib>
<bib id="0003">2009</bib>
</bibsection>
</comp>
説明:
ID ルールは、一致したすべてのノードを「そのまま」コピーします。
ID テンプレートをオーバーライドする単一のテンプレートがあり、それはあらゆるlink
要素に一致します。このテンプレートの本文のコードは、ID テンプレートを名前で呼び出して一致した要素を処理し、属性が の属性と同じ値を持つ最初の要素の文字列値を値とするテキスト ノードの子を使用して要素link
を構築します。マッチした要素。この要素の選択は、「kBibById」という名前の命令を参照する関数を使用して行われます。year
bib
id
id
link
bib
key()
xsl:key
注意:
上記のアイデンティティ ルールへのリンクは一時的に機能しません。しばらくの間、インターネット アーカイブから次のいずれかを使用してください。
http://web.archive.org/web/20081229160200/http://www.dpawson.co.uk/xsl/sect2/identity.html