Views: 25
JP PINTのSchematronスクリプトの不良に関する考察
この記事では、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/. = .)]) <= 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となり、テストは成功します。


一方、以下のような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

<rule context="/ubl:Invoice | /cn:CreditNote">
<assert id="aligned-ibrp-014" flag="fatal" test="count(//cbc:PaymentID) <= 1">[aligned-ibrp-014]-Remittance information (ibt-083) MUST occur maximum once.</assert>
</rule>
この修正により、`cbc:PaymentID`が1件以上存在する場合に正しくエラーが報告されるようになります。
まとめ
Schematronスクリプトの設計において、XPath式の条件設定は非常に重要です。誤った条件を設定すると、期待通りに検証が行われず、不具合の原因となります。この記事で示したように、問題の原因を特定し、適切な修正を行うことが重要です。
コメントを残す