次のxmlファイルがあります。
<Contract>
<TotalCosts>31003</TotalCosts>
<PaymentSchedules>
<PaymentSchedule>
<Amount>516.7</Amount>
<NumberOfPayments>3</NumberOfPayments>
</PaymentSchedule>
<PaymentSchedule>
<Amount>529.7</Amount>
<NumberOfPayments>1</NumberOfPayments>
</PaymentSchedule>
<PaymentSchedule>
<Amount>516.7</Amount>
<NumberOfPayments>55</NumberOfPayments>
</PaymentSchedule>
<PaymentSchedule>
<Amount>504.70</Amount>
<NumberOfPayments>1</NumberOfPayments>
</PaymentSchedule>
</PaymentSchedules>
</Contract>
私のスキーマトロン ファイルで、TotalCosts を paymentSchedule の金額と同じにしたいと考えています。
そのためには、PaymentSchedule ごとに次のことを行う必要があります。
金額 * 支払回数
その後、すべての PaymentSchedules の合計を取得する必要があり、その数はまったく同じである必要があります。与えられた例でこれを試すと、金額がまったく同じであることがわかります。
これを schematron で検証するために、次の schematron ファイルを作成しました。
<iso:schema xmlns:iso="http://purl.oclc.org/dsdl/schematron"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" queryBinding="xslt2">
<iso:ns uri="http://www.someurl.com" prefix="func"/>
<xsl:function name="func:getPaymentScheduleTotal">
<xsl:param name="contract" as="element()"/>
<xsl:value-of
select="sum($contract/PaymentSchedules/PaymentSchedule/(NumberOfPayments * Amount))"/>
</xsl:function>
<iso:pattern id="Contract">
<iso:rule context="Contract">
<iso:assert test="func:getPaymentScheduleTotal(.) = number(TotalCosts)">amount in paymentschedule(<iso:value-of select="func:getPaymentScheduleTotal(.)"/>) doesn't match total amount(<iso:value-of select="TotalCosts"/>)</iso:assert>
</iso:rule>
</iso:pattern>
</iso:schema>
しかし、ここで私は問題に直面しています。次の検証結果が得られます。
paymentschedule(31003.000000000004) の金額が合計金額 (31003) と一致しません (func:getPaymentScheduleTotal(.) = number(TotalCosts)) [assert]
.000000000004 がどこから来ているのかわかりません。もちろん、floor のようなものを使用して数値を四捨五入することもできますが、.000000000004 はそもそもそこにあるべきではないと思います。
何か案は?