首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可选元素的Schematron计算测试

可选元素的Schematron计算测试
EN

Stack Overflow用户
提问于 2013-11-19 00:55:13
回答 1查看 186关注 0票数 2

我需要创建一组Schematron规则来测试XML发票中的计算。问题是,一些被测试的元素是可选的,当被测试的元素是mjissing时,我的规则就会失败。如何指定类似于“如果元素存在,则测试值”之类的内容?

XML实例摘录:

代码语言:javascript
复制
<invoice>
<invoiceLineItem number="1">
    <invoicedQuantity>50</invoicedQuantity>
    <amountExclusiveAllowancesCharges>500</amountExclusiveAllowancesCharges>
    <amountInclusiveAllowancesCharges>455</amountInclusiveAllowancesCharges>
    <itemPrice>10</itemPrice>
    <invoiceAllowanceChargeAmount>45</invoiceAllowanceChargeAmount>
</invoiceLineItem>
<invoiceLineItem number="2">
    <invoicedQuantity>10</invoicedQuantity>
    <amountExclusiveAllowancesCharges>150</amountExclusiveAllowancesCharges>
    <itemPrice>15</itemPrice>
</invoiceLineItem>
</invoice>

我的Schematron正在检查计算:

代码语言:javascript
复制
<sch:schema xmlns:sch="http://www.ascc.net/xml/schematron">
    <sch:pattern name="Check calculation in invoicelineItem">
        <sch:rule context="invoiceLineItem">
            <sch:assert test="amountExclusiveAllowancesCharges = invoicedQuantity * itemPrice">The amountExclusiveAllowancesCharges calculation is incorrect.</sch:assert>
            <sch:assert test="amountInclusiveAllowancesCharges = (invoicedQuantity * itemPrice) - invoiceAllowanceChargeAmount">The amountInclusiveAllowancesCharges calculation is incorrect.</sch:assert>
        </sch:rule>
    </sch:pattern>
</sch:schema>

当缺少amountInclusiveAllowancesCharges和invoiceAllowanceChargeAmount (它们是可选的)时,它会失败。

如果有任何有用的建议,我将不胜感激,

Ewa

EN

回答 1

Stack Overflow用户

发布于 2014-11-22 06:37:38

也许为时已晚,但如果不是,或者其他人也有类似的问题:

代码语言:javascript
复制
<sch:schema xmlns:sch="http://www.ascc.net/xml/schematron">
    <sch:pattern name="Check calculation in invoicelineItem">
        <sch:rule context="invoiceLineItem">
            <sch:assert test="amountExclusiveAllowancesCharges = invoicedQuantity * itemPrice">The amountExclusiveAllowancesCharges calculation is incorrect.</sch:assert>
        </sch:rule>
    </sch:pattern>
    <sch:pattern name="Check calculation in invoicelineItem (inclusive)">
        <sch:rule context="invoiceLineItem[amountInclusiveAllowancesCharges][invoiceAllowanceChargeAmount]">
            <sch:assert test="amountInclusiveAllowancesCharges = (invoicedQuantity * itemPrice) - invoiceAllowanceChargeAmount">The amountInclusiveAllowancesCharges calculation is incorrect.</sch:assert>
        </sch:rule>
    </sch:pattern>
</sch:schema>

由于以下原因,您需要两个规则:http://www.schematron-quickfix.com/escali_xsm/escali-ext_en.html#sqf:d109e234

  • Any

  • invoiceLineItem is

    ,因为您希望每次都验证排他项的有效性,而包含项仅当它们可用时才需要两个模式

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20053310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档