JP PINT BIS ホームページの Syntax Binding ページに記載されている Selector の問題点

Views: 14

JP PINT BISホームページのSyntax Bindingページに記載されているSelectorの記載内容について、Selectorの表記が何を示しているのかの規定がどこにもありませんが、XPathのSelectorだと解釈すると各所に記載内容の誤りが散見されます。ここでは、外貨建て請求書の税額に関連した個所の記載内容の誤りについて解説します。

1. Selector(XPath)の基本と前提

1.1. Selectorとは?

Selector は、対応する XML ノード集合を機械的に特定するための XPath 式です。
正しく機能させるには、評価コンテキストの条件を明記する必要があります。

  • XPath バージョン:XPath 2.0

  • 評価起点:ドキュメント・ルート(/または 当該 Selector を適用するコンテキストノード

  • 返り値:ノードの列(シーケンス)。空列も許容されます

1.2. なぜ /ubl:Invoice は不適切か

JP PINT の Syntax Binding ページでは ubl:Invoice という表記が見られます。
これは Schematron ファイル(例:PINT-UBL-validation-preprocessed.sch)に由来しており、そこでは次のように ns 宣言で ubl が束縛されています。

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2">
    ...
  <ns prefix="ext" uri="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"/>
  <ns prefix="cbc" uri="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"/>
  <ns prefix="cac" uri="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"/>
  <ns prefix="qdt" uri="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDataTypes-2"/>
  <ns prefix="udt" uri="urn:oasis:names:specification:ubl:schema:xsd:UnqualifiedDataTypes-2"/>
  <ns prefix="cn" uri="urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2"/>
  <ns prefix="ubl" uri="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"/>
    ...
</schema>

Schematron 内ではこれで正しく解決されますが、XML 文書の XPath 評価では事情が異なります。
実際のデジタルインボイス文書では、ルート要素に既定(デフォルト)名前空間が設定されているため、名前空間接頭辞を付けずに /Invoice と指定します。

<?xml version="1.0" encoding="UTF-8"?>
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:ccts="urn:un:unece:uncefact:documentation:2" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns:qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDatatypes-2" xmlns:udt="urn:un:unece:uncefact:data:specification:UnqualifiedDataTypesSchemaModule:2" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<!-- 
Japan common commercial invoice, example2-Foreign Currency
-->

    ...
</Invoice>

この場合、XML文書に対する XPath 評価で /ubl:Invoice をそのまま実行しても一致しません
既定の要素名前空間を UBL に設定することで、/Invoice が正しく一致します。

2. 外貨(EUR)建て請求書に対する Selector

2.1. ISO/IEC 19845 (UBL 2.1) invoice and credit note のSyntax binding

CEN/TS 16931-3-2 Electronic invoicing – Part 3-2: Syntax binding for ISO/IEC 19845 (UBL 2.1) invoice and credit noteから関連するページを次に引用します。

CENTS16931 3 2a

CENTS16931 3 2b

BT-110 と BT-111 の Path が /Invoice/cac:TaxTotal/cbc:TaxAmount で同一になっており、Rules に区別条件が記載されていませんが、cbc:TaxAmount の属性 @currencyID が「インボイス通貨」か「税通貨」かを判定する Selector 条件付きの XPath を指定して区別します。

Note
なお、JP PINT の ID 値はそれぞれ IBT-110 および IBT-111 となっており、
EU仕様の BT(Business Term)IBT(International Invoice Business Term) に置き換えられています。

Selectorでは、通貨コードが/Invoiceの直下にcac:TaxTotalと並んで定義されているので、この記事では、コンテクストノードからの相対パス指定

/Invoice/cac:TaxTotal[cbc:TaxAmount/@currencyID=../cbc:DocumentCurrencyCode]

でなく、インボイス通貨では、/Invoice/cbc:DocumentCurrencyCode、税通貨では、/Invoice/cbc:TaxCurrencyCodeとドキュメント・ルート(/)からの絶対パスで指定していることに注意してください。

2.2. (参考)UN/CEFACT CII D16BのSyntax binding

CEN/TS 16931-3-3 Electronic invoicing – Part 3-3: Syntax binding for UN/CEFACT XML Industry Invoice D16Bから関連するページを次に引用します。

CENTS16931 3 3

欧州規格では、コアインボイスモデルの論理項目と XML スキーマの要素の対応関係を Syntax Binding 表 で定義しています。
この表では、各 XML 要素がどの要素の下位に定義されているかを Path 欄で指定し、さらに対応条件を Rules 欄に記述しています。

Note
BT-110 Invoice total VAT amounts
Desc: The total VAT amount for the Invoice.
Rules: @currencyID is mandatory to differentiate between VAT amount and VAT amount in accounting currency.

BT-111 Invoice total VAT amounts in accounting currency:
Desc: The VAT total amount expressed in the accounting currency accepted or required in the country of the Seller.
Rules: @currencyID is mandatory to differentiate between VAT amount and VAT amount in accounting currency.

なお、Path 欄の値は両者とも同じで、次のように記載されています。

/rsm:CrossIndustoryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettleMent/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:TaxTotalAmount

しかし、この対応表を拡張して XPath を用いた条件式 を記述すれば、対応条件をプログラムでも解釈可能な形で明確に定義できます。

請求書における VAT 合計金額は、同じ XML 要素 ram:TaxTotalAmount に格納されますが、属性 @currencyID の値によって、インボイス通貨で表された合計金額か、VAT 報告用の会計通貨で表された合計金額かを区別できます。

BT-110 Invoice total VAT amounts

/rsm:CrossIndustoryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettleMent/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:TaxTotalAmount[@currencyID=//ram:InvoiceCurrencyCode]

BT-111 Invoice total VAT amounts in accounting currency

/rsm:CrossIndustoryInvoice/rsm:SupplyChainTradeTransaction/ram:ApplicableHeaderTradeSettleMent/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:TaxTotalAmount[@currencyID=//ram:TaxCurrencyCode]

2.3. JP PINTのSyntax bindingページ

2.3.1. インボイス通貨の総税額

JP PINT IBT 110

このcac:TaxTotalの内容を確認するページの記載も問題個所が散見されます。

JP PINT TaxTotalDocument

Idの値が、SB-AUTO-64とされていますが、この値はこのページ以外では何ら記載されていませんのでBISとは無関係であり、不必要です。

また、Selectorの値cac:TaxTotal/TaxAmount/@currency = cbc:DocumentCurrencyCodeも間違った値です。

XML/XPath の理解不足に基づく文法エラーがあり、正しい XPath として解釈できません(TaxAmount の接頭辞不足、属性名は @currencyID、等)。

cac:TaxTotal がコンテキスト・ルートである正しい Selector(XPath 述語)は次のとおりです。

[cbc:TaxAmount/@currencyID=/Invoice/cbc:DocumentCurrencyCode]

インボイス通貨で表した合計税額に対する Syntax Binding(選択条件付きの完全パス) は次です。

/Invoice/cac:TaxTotal[cbc:TaxAmount/@currencyID=/Invoice/cbc:DocumentCurrencyCode]
  • XPath の意味
    /Invoice/cac:TaxTotal[cbc:TaxAmount/@currencyID=/Invoice/cbc:DocumentCurrencyCode] は、
    ルート要素 /Invoice の直下にある
    cac:TaxTotal 要素のうち、
    その内部にある cbc:TaxAmount 要素の @currencyID 属性値 が、同じ文書内の /Invoice/cbc:DocumentCurrencyCode 要素の値と等しいもの
    を選択する XPath 式です。

  • 日本語での簡潔な表現例
    「インボイス通貨コード(cbc:DocumentCurrencyCode)と同じ通貨 ID を持つ合計税額(cac:TaxTotal)要素を取得する XPath」

このcac:TaxTotalの内容を確認するページに初期のBISで記載されていたSyntax bindingに代えて、このXPathを記載することで、コンピュータ処理可能な明確な対応定義が表現できます。

Note
Selectorとして、/Invoice/cac:TaxTotal/TaxAmount/@currencyの値が、/Invoice/cbc:DocumentCurrencyCodeと等しいという条件を指定したいという意図が読み取れますが、このような表記方法はXMLでは規定されていません。 XPath2.0に従う表記とすべきです。+
TaxAmountには、接頭辞 cbc: が必要であり、正しくは、cbc:TaxAmountです。
金額要素の通貨属性は @currencyID(@currency ではありません)。
両式とも、Selector はコンテキストノードからの相対パスではなく、通貨コードは ドキュメント・ルート(/)からの絶対パス/Invoice/cbc:DocumentCurrencyCode または /Invoice/cbc:TaxCurrencyCode)で参照しています。

2.3.2. 税通貨の総税額

JP PINT IBG 37

IBG-37 DOCUMENT TOTALS IN TAX ACCOUNTING CURRENCYについてSyntax Element欄のcac:TaxTotalの下に記載された赤字の文字列

[cac:TaxTotal/TaxAmount/@currency=cbc:TaxCurrencyCode]

がSelectorですが、Selector(XPath)の文字列として解釈できません。詳細は後述します。

JP PINT TaxTotalTax

このcac:TaxTotalの内容を確認するページの記載も問題個所が散見されます。
Idの値が、SB-IBG-37とされていますが、正しくはIBG-37です。
また、Selectorの値 cac:TaxTotal/TaxAmount/@currency=cbc:TaxCurrencyCodeも間違った値です。

2.4. 総税額を取得する場合

2.4.1. 推奨:通貨属性での特定(絶対パス)

BT-110(インボイス通貨の総税額)
/Invoice/cac:TaxTotal/cbc:TaxAmount[@currencyID=/Invoice/cbc:DocumentCurrencyCode]

XPathTaxAmountEUR

BT-111(税通貨の総税額)
/Invoice/cac:TaxTotal/cbc:TaxAmount[@currencyID=/Invoice/cbc:TaxCurrencyCode]

XPathTaxAmountJPY

2.4.2. 代替:cac:TaxTotal を絞り込んでから cbc:TaxAmount を取得(相対指定)

BT-110(インボイス通貨の総税額)
/Invoice/cac:TaxTotal[cbc:TaxAmount/@currencyID=/Invoice/cbc:DocumentCurrencyCode]/cbc:TaxAmount

XPathTaxAmountEUR2

BT-111(税通貨の総税額)
/Invoice/cac:TaxTotal[cbc:TaxAmount/@currencyID=/Invoice/cbc:TaxCurrencyCode]/cbc:TaxAmount

XPathTaxAmountJPY2

Warning
/Invoice/cac:TaxTotal/cbc:TaxAmount のみを Syntax Binding に記すと BT-110 と BT-111 を区別できません。
必ず @currencyID と DocumentCurrencyCode または TaxCurrencyCode との対応付けを条件に含めてください。

2.4.3. Syntax Binding 記載の不整合と特定方法

BT-110 Invoice total VAT amounts

IBT 110

Syntax Binding ページの記載には一貫性の欠如が見られます。
とくに IBT-110 の Id が SB-IBT-110 と誤記されています(正しくは IBT-110)。

また、インボイス通貨の総税額(BT-110)と税通貨の総税額(BT-111)は、いずれも

/Invoice/cac:TaxTotal/cbc:TaxAmount

に位置しており、このパス指定だけでは特定できません。PINT 1.0 初期記述に見られた ubl:Invoice / cac:TaxTotal / cbc:TaxAmount だけでは区別できないため、後の版で削除されたと考えられます。
しかし Syntax Binding に XPath を用いれば、一意に特定できます。

このときの指定方法としては、インボイス通貨のcac:TaxTotalを選択した上で、その下位要素であるcbc:TaxAmountを指定する次のXPath指定も可能です。

/Invoice/cac:TaxTotal[cbc:TaxAmount@currencyID=/Invoice/cbc:DocumentCurrencyCode]/cbc:TaxAmount

XPathTaxAmountEUR2

BT-111 Invoice total VAT amounts in tax accounting currency
/Invoice/cac:TaxTotal/cbc:TaxAmount[@currencyID=/Invoice/cbc:TaxCurrencyCode]/cbc:TaxAmount

XPathTaxAmountJPY2

Note
両式とも、Selector はコンテキストノードからの相対パスではなく、通貨コードは ドキュメント・ルート(/)からの絶対パス/Invoice/cbc:DocumentCurrencyCode または /Invoice/cbc:TaxCurrencyCode)で参照しています。
通貨コードを記載している属性は、@currency でなく、@currencyID です。 currencyID は無名名前空間なので接頭辞は不要です。
実装で 1..1 を保証したい場合は、[@currencyID=string((/Invoice/cbc:DocumentCurrencyCode)[1])]のように必要に応じて末尾に [1] を付けて単一化してください。

2.5. 税率別の合計総税額を取得する場合

2.5.1. cac:TaxTotal

JP PINT Syntax BindingIBT 110
ここに記載されている

[cac:TaxTotal/TaxAmount/@currency=cbc:DocumentCurrencyCode]

の Selector 指定は、Selector を適用する コンテキストノード cac:TaxTotal の下位にXML要素`cbc:DocumentCurrencyCode`が存在しないため誤りです。
また、/TaxAmount名前空間接頭辞が欠落、属性名も @currencyID が正 であり誤りです。
正しくは、

[cac:TaxTotal/cbc:TaxAmount/@currencyID=/Invoice/cbc:DocumentCurrencyCode]

JP PINT IBG 37

IGB-37に対して、記載されている次の Selector 指定は、

[cac:TaxTotal/TaxAmount/@currency=cbc:TaxCurrencyCode]

Selector を適用する コンテキストノード cac:TaxTotal の下位に cbc:TaxCurrencyCode が存在しないため誤りです。
また、/TaxAmount名前空間接頭辞が欠落、属性名も @currencyID が正 であり誤りです。

正しくは、次の値です。

[cac:TaxTotal/cbc:TaxAmount/@currencyID=/Invoice/cbc:TaxCurrencyCode]

2.5.2. 消費税(標準税率)の合計税額

XPathで消費税(標準税率)を指定することでその合計金額が求まります。

/Invoice/cac:TaxTotal[cbc:TaxAmount/@currencyID=/Invoice/cbc:DocumentCurrencyCode]/cac:TaxSubtotal[cac:TaxCategory/cbc:ID='S' and cac:TaxCategory/cac:TaxScheme/cbc:ID='VAT']/cbc:TaxAmount

XPathCategorySTaxAmountEUR

/Invoice/cac:TaxTotal[cbc:TaxAmount/@currencyID=/Invoice/cbc:TaxCurrencyCode]/cac:TaxSubtotal[cac:TaxCategory/cbc:ID='S' and cac:TaxCategory/cac:TaxScheme/cbc:ID='VAT']/cbc:TaxAmount

XPathCategorySTaxAmountJPY

3. まとめ

本稿では、JP PINT BIS ホームページの Syntax Binding ページに記載されている Selector の問題点を整理しました。

  • Selector は XPath 2.0 に基づき、評価コンテキストを明示したうえで記述する必要があることを確認しました。

  • /ubl:Invoice という表記は Schematron 内部での前提付き宣言に依存しており、シンプルな XPath 評価では /Invoice を使うべきであることを示しました。

  • インボイス通貨の総税額(IBT-110)と税通貨の総税額(IBT-111)は、いずれも /Invoice/cac:TaxTotal/cbc:TaxAmount に位置するため、単純なパス指定だけでは区別できません。
    → 区別には @currencyID 属性と /Invoice/cbc:DocumentCurrencyCode または /Invoice/cbc:TaxCurrencyCode を条件に組み込む必要があります。

  • Syntax Binding ページに掲載されている Selector 記述には、名前空間接頭辞の欠落や属性名の誤記(@currency ではなく @currencyID)など、XPath として解釈できない例が散見されます。

  • また、IBT 番号や Id の誤表記(例:SB-IBT-110SB-IBG-37)など、表記上の不整合も確認されました。

以上を踏まえると、JP PINT の Syntax Binding ページは、XPath 2.0 に準拠した正しい Selector 記述に修正し、IBT 番号や属性名を正確に統一することが必要です。これにより、インボイス通貨と税通貨の金額を正しく区別し、外貨建て請求書に関する誤解や実装上の不整合を防止できます。


投稿日

カテゴリー:

,

投稿者:

タグ:

コメント

コメントを残す

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