Visits: 284
シンタクスバインディングの詳細解説
セマンティックモデルの詳細画面には、Syntax bindingを定義している行があります。
ここに並んでいる文字列は、IBT-110 Invoice total TAX amount に対応した要素がデジタルインボイスのXML文書中のどの箇所に記載されているかを指し示す情報です。
画面に表示されている ubl:Invoice / cac:TaxTotal / cbc:TaxAmount という文字列からXPathの文字列を生成するには、先頭に / 記号を追加します。
/ubl:Invoice/cac:TaxTotal/cbc:TaxAmount
デジタルインボイスをプログラムで変換処理する際に、実行時のパラメタとして与えるのが、このXPath文字列です。
XPathは、インターネットでホームページから情報を抜き出すときにも使用される言語ですのでなじみのある方もおられると思います。
今回は Windows 10 で動くXML編集ソフト XML Spy を使用して確認します。
XML Spyでは確認中のXML文書の表示枠の下に XPathを入力してその条件に該当する箇所を探し当てる枠が用意されています。
/ubl:Invoice/cac:TaxTotal/cbc:TaxAmountを入力すると次の画面のようにEURの金額とJPYの金額が2件ヒットしました。
Invoice total TAX amountは、DocumentCurrencyCode EURで記録された合計の税額です。
インボイスが外貨のときには、この2件からDocumentCurrencyCode EURで記録された合計の税額に絞り込むために、条件を追加する事が必要です。
Invoice total TAX amountではシンタクスバインディングでUBL要素を説明している画面にも手掛かりとなる情報がありませんし、税会計通貨で記載するInvoice total TAX amount in tax accounting currencyの画面にも手掛かりはありません。
シンタクスバインディングの項目一覧表の定義情報をよく見ると、Invoice total TAX amount in tax accounting currencyの上の行に記載されたDOCUMENT TOTALS IN TAX ACCOUNTING CURRENCYになにやら赤色で表示された文字列が見えます。
インボイスの文書の通貨コード
こちらの画面には、Selectorという行があり、次の文字列が記載されています。
cac:TaxTotal/TaxAmount/@currency = cbc:TaxCurrencyCode
この文字列が、絞り込むための条件に関係ありそうです。
この条件ではインボイスの文書の通貨コードで記載された金額ではなく税会計通貨で記載された金額を指定する条件ですが、条件指定の方法を確認するためにこちらで作業を進めます。
XPathでは、検索条件を[ ]記号の内側に記述して追加しますので、この文字列を先ほどのXPath文字列に追加して、次の文字列を作成しました。
/Invoice/cac:TaxTotal/cbc:TaxAmount[cac:TaxTotal/TaxAmount/@currency = cbc:TaxCurrencyCode]
何もヒットしません。指定方法が間違っているようです。XPathでは、条件を指定する要素からの相対パスで条件として使用する要素を記述しなければいけません。
/Invoice/cac:TaxTotal/cbc:TaxAmount[@currencyID = /Invoice/cbc:TaxCurrencyCode]
@currencyは間違い。@currencyIDの値が/Invoice/cbc:TaxCurrencyCode JPYの値と等しい
<cac:TaxTotal>の下位要素<cbc:TaxAmount>が見つかりました。
Invoice total TAX amountは、その通貨コードがインボイスの文書の通貨コード
/Invoice/cac:TaxTotal/cbc:TaxAmount[@currencyID = /Invoice/cbc:DocumentCurrencyCode]
インボイスの文書の通貨コードEURの税額が見つかりました。
その他の紛らわしい selector
cbc:DocumentTypeCode != 130
人が読んだときには、「cbc:DocumentTypeCodeが130ではないとき」と解釈しますが。プログラムがXPathとして解釈するときには問題となります。
ここでは、130を数値でなく文字として指定するために’130’としていますが、
cbc:ChargeIndicator = false
falseという記述が問題です。<cbc:ChargeIndicator>ぼデータ型はBooleanですから、XPathのBool値 false()を使用しなければいけません。
cbc:ChargeIndicator = false のときには該当なしですが、
cbc:ChargeIndicator = false() のとき値引きが該当箇所でした。
シンタクスバインディングの表示方法の改善案
ここで詳解したように、XML文書の処理ではXPathを使用します。シンタクスバインディングの文字列にSelectorの文字列の追加説明を付与しておいて、ここで行ったような解析をプログラマに強いるよりは、対応定義を規定するXPath を要素それぞれに定義するほうが明快です。
BT Id |
Semantic Card. |
Term |
Syntax Card. |
Syntax Element |
1..1 |
cac:TaxTotal |
|||
IBT-110 |
1..1 |
Invoice total TAX amount |
1..1 |
• cbc:TaxAmount |
1..1 |
• • @currencyID |
|||
IBG-23 |
1..n |
TAX BREAKDOWN |
1..n |
• cac:TaxSubtotal |
IBT-116 |
1..1 |
TAX category taxable amount |
1..1 |
• • cbc:TaxableAmount |
1..1 |
• • • @currencyID |
|||
IBT-117 |
1..1 |
TAX category tax amount |
1..1 |
• • cbc:TaxAmount |
1..1 |
• • • @currencyID |
|||
1..1 |
• • cac:TaxCategory |
|||
IBT-118 |
1..1 |
TAX category code |
1..1 |
• • • cbc:ID |
IBT-119 |
0..1 |
TAX category rate |
0..1 |
• • • cbc:Percent |
1..1 |
• • • cac:TaxScheme |
|||
1..1 |
• • • • cbc:ID |
|||
IBG-37 |
0..1 |
DOCUMENT TOTALS IN TAX ACCOUNTING CURRENCY |
0..1 |
cac:TaxTotal |
IBT-111 |
0..1 |
Invoice total TAX amount in tax accounting currency |
0..1 |
• cbc:TaxAmount |
1..1 |
• • @currencyID |
|||
IBG-38 |
1..n |
TAX BREAKDOWN IN ACCOUNTING CURRENCY |
1..n |
• cac:TaxSubtotal |
IBT-190 |
0..1 |
TAX category tax amount in accounting currency |
0..1 |
• • cbc:TaxAmount |
1..1 |
• • • @currencyID |
|||
0..1 |
• • cac:TaxCategory |
|||
IBT-192 |
1..1 |
TAX category code for tax category tax amount in accounting currency |
0..1 |
• • • cbc:ID |
IBT-193 |
0..1 |
TAX category rate for tax category tax amount in accounting currency |
0..1 |
• • • cbc:Percent |
上記が現行の記載内容ですが、解釈に迷いますし、プログラムにそのまま渡すことなどできません。
BT Id |
Semantic Card. |
Term |
Syntax Card. |
XPath |
1..1 |
/Invoice /cac:TaxTootal [cbc:TaxAmount /@currencyID= /nvoice |
|||
IBT-110 |
1..1 |
Invoice total TAX amount |
1..1 |
/Invoice /cac:TaxTootal /cbc:TaxAmount [@currencyID = /Invoice |
1..1 |
/Invoice /cac:TaxTootal /cbc:TaxAmount [@currencyID = /Invoice |
|||
IBG-23 |
1..n |
TAX BREAKDOWN |
1..n |
/Invoice /cac:TaxTootal [cbc:TaxAmount /@currencyID = /Invoice |
IBT-116 |
1..1 |
TAX category taxable amount |
1..1 |
/Invoice /cac:TaxTootal [cbc:TaxAmount /@currencyID = /Invoice |
1..1 |
/Invoice /cac:TaxTootal [cbc:TaxAmount /@currencyID = /Invoice |
|||
IBT-117 |
1..1 |
TAX category tax amount |
1..1 |
/Invoice /cac:TaxTootal [cbc:TaxAmount /@currencyID = /Invoice |
1..1 |
/Invoice /cac:TaxTootal [cbc:TaxAmount /@currencyID = /Invoice |
|||
1..1 |
/Invoice /cac:TaxTootal [cbc:TaxAmount /@currencyID = /Invoice |
|||
IBT-118 |
1..1 |
TAX category code |
1..1 |
/Invoice /cac:TaxTootal [cbc:TaxAmount /@currencyID = /Invoice |
IBT-119 |
0..1 |
TAX category rate |
0..1 |
/Invoice /cac:TaxTootal [cbc:TaxAmount /@currencyID = /Invoice |
1..1 |
/Invoice /cac:TaxTootal [cbc:TaxAmount /@currencyID = /Invoice |
|||
1..1 |
/Invoice /cac:TaxTootal [cbc:TaxAmount /@currencyID = /Invoice |
|||
IBG-37 |
0..1 |
DOCUMENT TOTALS IN TAX ACCOUNTING CURRENCY |
0..1 |
/Invoice /cac:TaxTootal [cbc:TaxAmount /@currencyID = /Invoice /cbc:TaxCurrencyCode] |
IBT-111 |
0..1 |
Invoice total TAX amount in tax accounting currency |
0..1 |
/Invoice /cac:TaxTootal /cbc:TaxAmount [@currencyID = /Invoice /cbc:TaxCurrencyCode] |
1..1 |
/Invoice /cac:TaxTootal /cbc:TaxAmount [@currencyID = /Invoice /cbc:TaxCurrencyCode] |
|||
IBG-38 |
1..n |
TAX BREAKDOWN IN ACCOUNTING CURRENCY |
1..n |
/Invoice /cac:TaxTootal [cbc:TaxAmount /@currencyID = /Invoice /cbc:TaxCurrencyCode] |
IBT-190 |
0..1 |
TAX category tax amount in accounting currency |
0..1 |
/Invoice /cac:TaxTootal [cbc:TaxAmount /@currencyID = /Invoice /cbc:TaxCurrencyCode] |
1..1 |
/Invoice /cac:TaxTota [cbc:TaxAmount /@currencyID = /Invoice /cbc:TaxCurrencyCode] |
|||
0..1 |
/Invoice /cac:TaxTota [cbc:TaxAmount /@currencyID = /Invoice /cbc:TaxCurrencyCode] |
|||
IBT-192 |
1..1 |
TAX category code for tax category tax amount in accounting currency |
0..1 |
/Invoice /cac:TaxTota [cbc:TaxAmount /@currencyID = /Invoice /cbc:TaxCurrencyCode] |
IBT-193 |
0..1 |
TAX category rate for tax category tax amount in accounting currency |
0..1 |
/Invoice /cac:TaxTota [cbc:TaxAmount /@currencyID = /Invoice /cbc:TaxCurrencyCode] |
こちらの内容であれば、人手を介さずにプログラムに渡すことが可能です。
技術仕様書は、技術者が見て理解したうえでプログラム実装につなげるという20世紀型でなく、プログラムに読ませて処理を実行させるという21世紀型にしてゆかないと開発のDXが実現しません。
selectorについての記事「JP PINT Syntax binding の Selectorとは何ですか?」も併せてお読みください。