JP PINTのSchematronスクリプトの不良に関する考察

Views: 25

この記事では、JP PINTのSchematronスクリプトにおける不良箇所について、具体的な例を挙げて説明します。特に、XPath式の条件設定に関する誤りとその修正方法について詳述します。

背景

JP PINTでは、UBL(Universal Business Language)を使用した請求書やクレジットノートの検証にSchematronを使用しています。ここでは、以下のルールを例に説明します。

<rule context="/ubl:Invoice | /cn:CreditNote">
   <assert id="aligned-ibrp-014" flag="fatal" test="count(//cbc:PaymentID[not(preceding::cbc:PaymentID/. = .)]) &lt;= 1">[aligned-ibrp-014]-Remittance information (ibt-083) MUST occur maximum once.</assert>
</rule>

このルールは、`cbc:PaymentID`が複数回出現することを防ぐためのものです。しかし、XPath式の条件設定に誤りがあり、期待通りに動作しない場合があります。

問題の詳細

以下のXPath式は、その値が前に出現した兄弟要素の値と等しくない`cbc:PaymentID`を選択するものです。

count(//cbc:PaymentID[not(preceding::cbc:PaymentID/. = .)] <= 1

具体的には、以下のようなXML断片に対して、このXPath式がどのように評価されるかを見てみましょう。

<cac:PaymentMeans> <!-- IBG-16 - PAYMENT INSTRUCTIONS -->
    <cbc:PaymentID>1234</cbc:PaymentID> <!-- IBT-083 - Remittance information -->
    <cbc:PaymentID>1234</cbc:PaymentID>
    <cbc:PaymentID>1234</cbc:PaymentID>
</cac:PaymentMeans>

この場合、先頭要素のみが条件に一致するため、count()関数の結果は1となり、テストは成功します。

preceeding
validation

一方、以下のようなXML断片の場合を考えます。

<cac:PaymentMeans> <!-- IBG-16 - PAYMENT INSTRUCTIONS -->
    <cbc:PaymentID>1234</cbc:PaymentID> <!-- IBT-083 - Remittance information -->
    <cbc:PaymentID>abcd</cbc:PaymentID>
    <cbc:PaymentID>5678</cbc:PaymentID>
</cac:PaymentMeans>

この場合、全ての要素が条件に該当するため、count()関数の結果は3となり、テストは失敗しエラーが報告されます。

修正方法

`cbc:PaymentID`要素が1件のみ存在することをチェックするためには、XPath式内の条件を取り除き、単純に以下のようにする必要があります。

count(//cbc:PaymentID) <= 1
count lt1
<rule context="/ubl:Invoice | /cn:CreditNote">
   <assert id="aligned-ibrp-014" flag="fatal" test="count(//cbc:PaymentID) &lt;= 1">[aligned-ibrp-014]-Remittance information (ibt-083) MUST occur maximum once.</assert>
</rule>

この修正により、`cbc:PaymentID`が1件以上存在する場合に正しくエラーが報告されるようになります。

まとめ

Schematronスクリプトの設計において、XPath式の条件設定は非常に重要です。誤った条件を設定すると、期待通りに検証が行われず、不具合の原因となります。この記事で示したように、問題の原因を特定し、適切な修正を行うことが重要です。


投稿日

カテゴリー:

,

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です