我有以下 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>
在我的 schematron 文件中,我想让 TotalCosts 与 paymentSchedule 中的金额相同。
为此,我需要为每个 PaymentSchedule 执行以下操作:
金额 * NumberOfPayments
之后,我需要取所有 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 一开始就不应该在那里。
有任何想法吗?