要素の検索に関しては、これはxsl:keyを使用するのに理想的な状況です。したがって、サンプルでは、製品の価格を調べたい場合があるため、次のようにキーを定義します
<xsl:key name="prices" match="productprice" use="refProduct/@id" />
したがって、これにより、製品 ID の値を使用して、productprice要素にアクセスできるようになります。具体的には、製品要素に配置されている場合、次のようにキーにアクセスして総額を取得します。
<xsl:value-of select="key('prices', @id)/price/@gross" />
製品の表示に関しては、一般的に言えば、XSLT の「精神」に沿っているため、 xsl:for-eachよりもxsl:apply-templatesを使用する方が望ましいことがよくあります。
<xsl:apply-templates select="products/product" />
テンプレートを複数の場所で呼び出してコードの重複を減らすことができ、特にコードのインデントを減らすことで、コードを読みやすくすることができます。
ここに完全な XSLT があります
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="prices" match="productprice" use="refProduct/@id" />
<xsl:template match="/order">
<table>
<xsl:apply-templates select="products/product" />
</table>
</xsl:template>
<xsl:template match="product">
<tr>
<td><xsl:value-of select="@id" /></td>
<td><xsl:value-of select="key('prices', @id)/price/@gross" /></td>
</tr>
</xsl:template>
</xsl:stylesheet>
次の整形式 XML に適用すると、
<order>
<products>
<product id="1234">
<item quantity="5" colour="red"/>
<item quantity="2" colour="blue"/>
</product>
<product id="9876">
<item quantity="10" colour="teal"/>
</product>
</products>
<prices>
<productprice>
<refProduct id="1234"/>
<price gross="9.99"/>
</productprice>
<productprice>
<refProduct id="9876"/>
<price gross="6.89"/>
</productprice>
</prices>
</order>
以下が出力されます
<table>
<tr>
<td>1234</td>
<td>9.99</td>
</tr>
<tr>
<td>9876</td>
<td>6.89</td>
</tr>
</table>