Search Posts

Visits: 397

JP PINT Syntax bindingのSyntax Element欄には、セマンティックモデルのBusiness Termに対応するUBL InvoiceのXML要素が記載されています。
この欄に記載されている要素の中には、その表示が2段になっていて、下の段には [ Selector ] のように表示されているものがあります。
このSelectorとは一体何なのでしょうか。

標準仕様は、人が見て理解できるだけでなく、プログラムが読み込んで意味のある処理を間違いなく実行できるものであるべきだと思います。

XML言語には、インスタンス文書中でXMLの要素や属性を一位に指定する表現としてXPathが提供されています。
XPathでは、元になるXML要素との相対位置や選択条件を指定してXMLの要素や属性を一位に指定します。
XPathにはいくつかのバージョンがありますが一般にはそのバージョン2 XPath2.0が使用されています。

元になるXML要素の選択条件を指定する表現がSelectorです。
例えば、
IBG-20 DOCUMENT LEVEL ALLOWANCES では、
cac:AllowanceCharge[cbc:ChargeIndicator = false]
IBG-21 DOCUMENT LEVEL CHARGES では、
cac:AllowanceCharge[cbc:ChargeIndicator = true]
と同じXML要素cac:AllowanceChargeに対応づけられていますが、どちらのcac:AllowanceChargeに対応づけられるかは、cac:AllowanceChargeの下位要素cbc:ChargeIndicatorの値によって決定されます。

JP PINT Syntax bindingページからubl:Invoiceを辿ると表示されるubl:InvoiceのTerm欄に表示されるSyntax Elementの中にはその表示が2段になっていて、下の段には [ Selector ] のように表示されているものがあるので確認してください。Syntax bindingの確認には、先頭ページよりもこちらから始めたほうがわかりやすいと思います。

  <cac:AllowanceCharge>
    <cbc:ChargeIndicator>true</cbc:ChargeIndicator>
    <cbc:AllowanceChargeReason>諸掛</cbc:AllowanceChargeReason>
    <cbc:Amount currencyID="JPY">17700</cbc:Amount>
    <cac:TaxCategory>
      <cbc:ID>S</cbc:ID>
      <cbc:Percent>10</cbc:Percent>
    </cac:TaxCategory>
  </cac:AllowanceCharge>

IBG-37 DOCUMENT TOTALS IN TAX ACCOUNTING CURRENCY

この項目は、IBG-22 DOCUMENT TOTALSに対応する項目です。税の情報が外貨で記載されているとき、税務会計で使用する通貨で記載された税についての情報です。
対応づけの関係が分かりづらいので、表にすると次のようになっています。

請求書通貨単位 税務報告通貨単位(請求書通貨単位が外貨のとき)
IBG-22 DOCUMENT TOTALS IBG-37 DOCUMENT TOTALS IN TAX ACCOUNTING CURRENCY
IBT-110 • Invoice total Tax amount IBT-111 • Invoice total Tax amount in tax accounting currency
IBG-23 TAX BREAKDOWN IBG-38 • TAX BREAKDOWN IN TAX ACCOUNTING CURRENCY
IBT-116 • Tax category taxable amount 対応項目なし
IBT-117 • Tax category tax amount IBT-190 • • Tax category tax amount in accounting currency
IBT-118 • Tax category code IBT-192 • • Tax category code for tax category tax amount in accounting currency
IBT-119 • Tax category rate IBT-193 • • Tax category rate for tax category tax amount in accounting currency
    <cac:TaxTotal>
    <-- /Invoice/cac:TaxTotal[cbc:TaxAmount/@currencyID=/Invoice/cbc:DocumentCurrencyCode/text()] -->
        <cbc:TaxAmount currencyID="SEK">400</cbc:TaxAmount> <-- IBT-110 -->
        <cac:TaxSubtotal> <-- IBG-23 -->
        <-- /Invoice/cac:TaxTotal[cbc:TaxAmount/@currencyID=/Invoice/cbc:DocumentCurrencyCode/text()]/cac:TaxSubtotal -->
            <cbc:TaxableAmount currencyID="SEK">4000</cbc:TaxableAmount> <-- IBT-116 -->
            <cbc:TaxAmount currencyID="SEK">400</cbc:TaxAmount> <-- IBT-117 -->
            <cac:TaxCategory>
                <cbc:ID>S</cbc:ID> <-- IBT-118 -->
                <cbc:Percent>10</cbc:Percent> <-- IBT-119 -->
                <cac:TaxScheme>
                    <cbc:ID>VAT</cbc:ID>
                </cac:TaxScheme>
            </cac:TaxCategory>
        </cac:TaxSubtotal>
    </cac:TaxTotal>
    <cac:TaxTotal> <-- IBG-37 -->
    <-- /Invoice/cac:TaxTotal[cbc:TaxAmount/@currencyID=/Invoice/cbc:TaxCurrencyCode/text()] -->
        <cbc:TaxAmount currencyID="JPY">5380</cbc:TaxAmount> <-- IBT-111 -->
        <cac:TaxSubtotal> <-- IBG-38 -->
        <-- /Invoice/cac:TaxTotal[cbc:TaxAmount/@currencyID=/Invoice/cbc:TaxCurrencyCode/text()]/cac:TaxSubtotal -->
            <cbc:TaxAmount currencyID="JPY">5380</cbc:TaxAmount> <-- IBT-117 -->
            <cac:TaxCategory>
                <cbc:ID>S</cbc:ID> <-- IBT-118 -->
                <cbc:Percent>10</cbc:Percent> <-- IBT-119 -->
                <cac:TaxScheme>
                    <cbc:ID>VAT</cbc:ID>
                </cac:TaxScheme>
            </cac:TaxCategory>
        </cac:TaxSubtotal>
    </cac:TaxTotal>
 

JP PINT Invoice Veesion 0.9.3 Semantic modelから内容を表示するページを確認すると、

IBG-22 DOCUMENT TOTALS
Syntax binding
ubl:Invoice / cac:TaxTotal / cac:LegalMonetary Total
IBG-37 DOCUMENT TOTALS IN TAX ACCOUNTING CURRENCY
Syntax binding ubl:Invoice / cac:TaxTotal

IBG-23 TAX BREAKDOWN
Syntax binding
ubl:Invoice / cac:TaxTotal / cac:TaxSubtotal
IBG-38 TAX BREAKDOWN IN TAX ACCOUNTING CURRENCY
Syntax binding ubl:Invoice / cac:TaxTotal / cac:TaxSubtotal

IBG-23とIBG-38は、同じUBLの要素cac:TaxSubtotalに対応づけられていますが、それぞれ、上位のcac:TaxTotalを区別して対応づけられています。
この区別のための条件が、Selectorです。
/ubl:Invoice/cac:TaxTotal/TaxAmount/@currencyが請求書が使用している通貨単位( /ubl:Invoice/cbc:CocumentCurrencyCode )を使用していれば、IBG-23。請求書の通貨単位が外貨のとき、税額報告で使用する通貨単位は /ubl:Invoice/cbc:TaxCurrencyCode の値として別に記載されているので /ubl:Invoice/cac:TaxTotal/TaxAmount/@currencyが税額報告で使用する通貨単位であればIBG-38であるとして区別できます。

正しいXPath表現ではそれぞれ、次のように正確に表記でき、この記載内容であれば人手でによらずともプログラムが理解できるのでデジタル処理が可能です。
リンク先は私の検証ページです。それぞれの記載内容をご確認ください。
IBG-23
/ubl:Invoice/cac:TaxTotal[cbc:TaxAmount/@currencyID=/Invoice/cbc:DocumentCurrencyCode/text()]/cac:TaxSubtotal

IBG-38
/ubl:Invoice/cac:TaxTotal[cbc:TaxAmount/@currencyID=/Invoice/cbc:TaxCurrencyCode/text()]/cac:TaxSubtotal

JP PINT 0.93のセマンティックページに記載されている Syntax binding
ubl:Invoice / cac:TaxTotal / cac:TaxSubtotal
という表記には曖昧さが残っており、正確な対応先を上記のようにXPathで記載すべきであると提言していましたがご理解いただけていません。
/ubl:Invoice/cac:TaxTotal[cbc:TaxAmount/@currencyID=/Invoice/cbc:TaxCurrencyCode/text()]/cac:TaxSubtotal
と正確に記述しないとプログラムではたどり着けません。

また、Syntax bindingのページも意味が汲み取りにきくなっていますが、セマンティックモデルからUBL構文への対応表とUBL構文からセマンティックモデルの項目への対応表と2つの対応表をXPathを意識して表記することでかなり分かりやすくできます。

次のリンク先の一覧表示をご確認ください。
セマンティックモデルからUBL構文
UBL構文からセマンティックモデルの項目
selector欄は、現状の値をそのまま記載しています。本来のXPath表記との違いもご確認ください。

Selector一覧

Syntax bindingの表の表のSyntax Element欄にSelectorの記載がある箇所を抜き出して対応するXPathを生成すると次のようになります。
/ubl:Invoice/cac:AdditionalDocumentReference[cbc:DocumentTypeCode = 130]
IBG-24 /ubl:Invoice/cac:AdditionalDocumentReference[cbc:DocumentTypeCode != 130]
/ubl:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyIdentification[cac:ID/@schemeID = “SEPA”]
/ubl:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme[cac:TaxScheme = “VAT”]
/ubl:Invoice/cac:AccountingSupplierParty/cac:Party/cac:PartyTaxScheme[cac:TaxScheme != “VAT”]
IBG-20 /ubl:Invoice/cac:AllowanceCharge[cbc:ChargeIndicator = false]
IBG-21 /ubl:Invoice/cac:AllowanceCharge[cbc:ChargeIndicator = true]
/ubl:Invoice/cac:TaxTotal[cac:TaxTotal/TaxAmount/@currency = cbc:DocumentCurrencyCode]
IBG-37 /ubl:Invoice/cac:TaxTotal[cac:TaxTotal/TaxAmount/@currency = cbc:TaxCurrencyCode]
IBG-36 /ubl:Invoice/cac:InvoiceLine/cac:DocumentReference[cbc:DocumentTypeCode != 130]
/ubl:Invoice/cac:InvoiceLine/cac:DocumentReference[cbc:DocumentTypeCode = 130]
IBG-27 /ubl:Invoice/cac:InvoiceLine/cac:AllowanceCharge[cbc:ChargeIndicator = false]
IBG-28 /ubl:Invoice/cac:InvoiceLine/cac:AllowanceCharge[cbc:ChargeIndicator = true]

Business Term IDの記載がない箇所にSelectorが箇所があり表を読みにくくしています。
また、条件指定の記載内容が、比較対象のXMLデータ型を考慮していないことや比較に基点位置を無視しているため、この復元したXPathでは、シンタクスエラーとなります。

例えば、cbc:ChargeIndicator = falseやcbc:ChargeIndicator = trueの表記は、cbc:ChargeIndicatorがブール型なので、正しくは、文字としての表現”false”か”true”あるいはブール型のfalse()かtrue()としなければいけません。

IBG-37 /ubl:Invoice/cac:TaxTotal[cac:TaxTotal/TaxAmount/@currency = cbc:TaxCurrencyCode]
では、比較の起点がcac:TaxTotalですから、cac:TaxTotal/TaxAmount/@currency = cbc:TaxCurrencyCode]ではなく[TaxAmount/@currency = /*/cbc:TaxCurrencyCode]としなければいけません。
/ubl:Invoice/cac:TaxTotal[TaxAmount/@currency = /*/cbc:TaxCurrencyCode]

なお、cac:PartyTaxScheme[cac:TaxScheme = “VAT”]では、cac:TaxSchemeの値を比較していますが、正しくは、[cac:TaxScheme/cbc:ID = “VAT”]でなければいけません。

デジタル処理のためには、前提条件を明確にして、それに準拠したプログラム処理を可能とすることが必須です。

仕様書は、人が見てなんとなく理解したつもりでプログラムを開発するためのものではなく、仕様書をプログラムが解析して処理ロジックを実行するようにしなければいけないと考えています。