Search Posts

Visits: 768

以下で紹介したCEFのスキーマトロンは、業務の専門家と技術の専門家の分担作業に最適な構成です。
このファイル構成の時の検証実施方法については次の記事をお読みください。


2021-05-21投稿

CEFのGitHub EN16931 Validation artefacts v.1.3.2 からバリデーション関係のファイルをコピーして確認する。

ディレクトリ構成

UBL 2.1関連のファイルは、次の構造で格納されている。UBLのスキーマは、GitHubには登録されていないので、OASISから入手しなさいとの指示がschema/README.mdに書いてある。
exampleディレクトリに電子インボイスの例がいくつか登録されている。
Schematron関連ファイルとそれに対応したXSLTファイルが登録されている。
schematronディレクトリには、元となるEN16931-UBL-validation.schから、abstract定義とそれをuBL対応に展開するための定義を読み込む構成となっている。

.
├── examples
│   ├── ubl-tc434-creditnote1.xml
│   ├── ubl-tc434-example1.xml
│   ├── ubl-tc434-example1_Error.xml
│   ├── ubl-tc434-example2.xml
│   ├── ubl-tc434-example3.xml
│   ├── ubl-tc434-example4.xml
│   ├── ubl-tc434-example5.xml
│   ├── ubl-tc434-example6.xml
│   ├── ubl-tc434-example7.xml
│   ├── ubl-tc434-example8.xml
│   └── ubl-tc434-example9.xml
├── schema
│   └── README.md
├── schematron
│   ├── EN16931-UBL-validation.sch
│   ├── UBL
│   │   ├── EN16931-UBL-model.sch
│   │   └── EN16931-UBL-syntax.sch
│   ├── abstract
│   │   ├── EN16931-model.sch
│   │   └── EN16931-syntax.sch
│   ├── codelist
│   │   └── EN16931-UBL-codes.sch
│   └── preprocessed
│       └── EN16931-UBL-validation-preprocessed.sch
└── xslt
    └── EN16931-UBL-validation.xslt

abstract定義

abstract/EN16931-model.schファイルの先頭部分を次に示す。
先頭行の
<pattern xmlns=”http://purl.oclc.org/dsdl/schematron” abstract=”true” id=”model”>
では、abstract=”true”とid=”model”が指定されている。
pattern要素は、いくつかのrule要素を含んでいる。
rule要素でassert要素を指定することで、満足しなければならない検証条件を宣言している。
abstractファイルに、具体的なXPath宣言を含めないことで、検証ルールを見やすくすると同時に、UN/CEFACT CII等、異なる文法の標準データでも再利用可能としている。

<pattern xmlns="http://purl.oclc.org/dsdl/schematron" abstract="true" id="model">

  <rule context="$Amount_due">
    <assert test="$BR-CO-25" flag="fatal" id="BR-CO-25">[BR-CO-25]-In case the Amount due for payment (BT-115) is positive, either the Payment due date (BT-9) or the Payment terms (BT-20) shall be present.</assert>
  </rule>
  <rule context="$Buyer_electronic_address">
    <assert test="$BR-63" flag="fatal" id="BR-63">[BR-63]-The Buyer electronic address (BT-49) shall have a Scheme identifier.    </assert>
  </rule>

...

UBL定義

UBL/EN16931-UBL-model.schファイルの先頭部分を次に示す。
pattern要素のidを、展開時のpattern要素のis-a属性に指定することで置き換え対象を選択する。
assert要素で指定しているtest=”$BR-CO-25″ flag=”fatal” id=”BR-CO-25″の内容は、置き換え時にparam要素のname属性で、BR-CO-25を指定し、置き換える内容をvalue属性にXPathを指定して満足すべき条件を関数定義して記述する。

<pattern xmlns="http://purl.oclc.org/dsdl/schematron" is-a="model" id="UBL-model">

  <param name="Amount_due" value="/ubl:Invoice/cac:LegalMonetaryTotal/cbc:PayableAmount "/>
  <param name="BR-CO-25" value="((. &gt; 0) and (exists(//cbc:DueDate) or exists(//cac:PaymentTerms/cbc:Note))) or (. &lt;= 0)"/>

  <param name="Buyer_electronic_address" value="cac:AccountingCustomerParty/cac:Party/cbc:EndpointID"/>
  <param name="BR-63" value="exists(@schemeID)"/>

...

preprocessed展開結果

preprocessed/EN16931-UBL-validation-preprocessed.schファイルの先頭部分を次に示す。
abstractファイルにUBL定義ファイルのparam定義を代入した結果を次に示す。
抽象定義と具体的なファイルの箇所のXPath定義を分割することで、より明快な定義内容のファイルになっている。

...
  <pattern id="UBL-model">
...
    <rule context="/ubl:Invoice/cac:LegalMonetaryTotal/cbc:PayableAmount">
      <assert id="BR-CO-25" flag="fatal" test="((. > 0) and (exists(//cbc:DueDate) or exists(//cac:PaymentTerms/cbc:Note))) or (. &lt;= 0)">[BR-CO-25]-In case the Amount due for payment (BT-115) is positive, either the Payment due date (BT-9) or the Payment terms (BT-20) shall be present.</assert>
    </rule>
 ...
    <rule context="cac:AccountingCustomerParty/cac:Party/cbc:EndpointID">
      <assert id="BR-63" flag="fatal" test="exists(@schemeID)">[BR-63]-The Buyer electronic address (BT-49) shall have a Scheme identifier.    </assert>
    </rule>
...