Расчетные тесты Schematron для необязательных элементов

Мне нужно создать набор расчетов проверки правил Schematron в счете-фактуре XML. Проблема в том, что некоторые из тестируемых элементов являются необязательными, и мои правила не работают, когда тестируемые элементы не работают. Как указать что-то вроде: «тестовое значение, если элемент присутствует»?

Выдержка из экземпляра XML:

<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 проверяет расчет:

<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 (они необязательны.

Буду благодарен за полезные советы,

Ева


person user3005519    schedule 18.11.2013    source источник


Ответы (1)


Может быть, уже поздно, но если нет, или у кого-то еще есть похожий вопрос:

<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>
  • Вам нужно два правила, потому что вы хотите проверять invoiceLineItem каждый раз для исключений, но включительно, только если они доступны (context="invoiceLineItem[amountInclusiveAllowancesCharges][invoiceAllowanceChargeAmount]").
  • Из-за этого вам нужны два шаблона: http://www.schematron-quickfix.com/escali_xsm/escali-ext_en.html#sqf:d109e234
  • Все остальное одинаково
person Nico Kutscherauer    schedule 21.11.2014