次のような XML があります。
<risk>
<driver driverId="2">
<vehicleUse>M</vehicleUse>
</driver>
<driver driverId="3">
<vehicleUse>F</vehicleUse>
</driver>
<driver driverId="4">
<vehicleUse>I</vehicleUse>
</driver>
</risk>
XSLT (v1.0、.NET 実装) を使用して各 vehicleUse を数値に変換し、それらの数値の合計を取得しています。vehicleUses は、M=3、F=2、および I=1 として変換されます。さらに複雑なのは、ID が 3 のドライバーの場合、これらの値が 10 倍され、ドライバー 4 の場合は 100 倍されることです。したがって、上記の例では、合計は 3 + 20 + 100 = 123 になります。
XSLT ファイルでテンプレートを次のように定義しました。
<xsl:template name="getVehicleUseScore">
<xsl:param name="driverId" />
<xsl:param name="vehicleUse" />
<!-- Implementation left out for brevity -->
</xsl:template>
次に、XSLT ファイルの残りの部分がテンプレートを呼び出します。
<xsl:template match="risk">
<vehicleUseScore>
<xsl:for-each select="driver">
<xsl:call-template name="getVehicleUseScore">
<xsl:with-param name="driverId" select="@driverId" />
<xsl:with-param name="vehicleUse" select="vehicleUse" />
</xsl:call-template>
</xsl:for-each>
</vehicleUseScore>
</xsl:template>
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
その結果、3、20、100 が連結された "320100" というテキストが得られます。これは、少なくとも getVehicleUseScore テンプレートが機能することを証明しています。
getVehicleUseScore の結果を sum() 関数に渡したいのですが、方法がわかりません。私は次のことを試しました;
<xsl:value-of select="sum(getVehicleUseScore(@driverId, vehicleUse))" />
しかし、XSLT コンパイラは、「getVehicleUseScore() は不明な XSLT 関数です」と述べています。
これを行う方法はありますか?