Views: 91
Syntax bindingのselectorが依然として間違ったままです。
こちらの記事も併せてご確認ください。
JP PINT V1.0間違い探し 2023-01-06
ChatGPTは日本語が母国語でないので、要求事項を正しく理解せずに自己解釈して回答してくるので、再々々々々確認まで行わないと正しい回答をしてくれませんでした。ChatGPTは物知りですが、その回答を鵜呑みにせず、検証しながら問いただすことで正しい解答が得られます。
OpenPeppolにもChatGPT程度のXML, XPath, Schematronの知識のあるエンジニアはおられるのですが、日本対応の作業についての確認が十分とはいえないようです。日本での公開前にしっかり検証して頂きたいなと思います。
Syntax bindingのselector
質問
UBL2.1のXML文書に対するXPathの指定方法について次の指定に問題があれば、その理由を説明してください。
cac:TaxTotal
[cac:TaxTotal/TaxAmount/@currency = cbc:DocumentCurrencyCode]
指定されたXPathには問題があります。UBL 2.1のXML文書において、XML要素や属性の名前は名前空間(Namespace)によって修飾されるため、正しいXPathを指定するためには名前空間を考慮する必要があります。
指定されたXPath [cac:TaxTotal/TaxAmount/@currency = cbc:DocumentCurrencyCode] では、cacとcbcという名前空間接頭辞が使用されていますが、これらの接頭辞がどの名前空間URIにマップされているかを示す名前空間宣言が提供されていないため、エラーが発生します。
正しいXPathの指定方法は、次の手順に従って行います:
XML文書のルート要素(通常は<Invoice>など)で使用される名前空間接頭辞と対応する名前空間URIを確認します。
XPathの開始部分で、使用する名前空間接頭辞とURIをマッピングします。これは通常、XPathのコンテキストに応じて行われます。
XPathの要素や属性の部分で、正しい名前空間接頭辞を使用して修飾された要素や属性名を指定します。
例えば、UBL 2.1のXML文書では通常、cacとcbcという名前空間接頭辞が使用されます。名前空間URIの例としては、urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2(cac)やurn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2(cbc)があります。
正しいXPathの指定例は次の通りです:
cac:TaxTotal[cac:TaxAmount/@currency = cbc:DocumentCurrencyCode]
このように正しく名前空間を指定することで、指定された要素や属性を正確に特定することができます。
再確認
cbc:DocumentCurrencyCodeの条件指定を訂正願います。XML文書は、次のようなものです。
cac:TaxTotal[cac:TaxAmount/@currency = cbc:DocumentCurrencyCode]のようにcac:TaxTotalを条件指定で選択してください
ここで提示したインボイスは、ページ最後の[提示したインボイス]から確認できます。
指定された条件 cac:TaxTotal[cac:TaxAmount/@currency = cbc:DocumentCurrencyCode] は、正しい構文であり、問題はありません。この条件は、cac:TaxTotal 要素を選択し、その下の cac:TaxAmount 要素の currencyID 属性が cbc:DocumentCurrencyCode 要素の値と等しい場合にマッチすることを意味します。
具体的には、次の行が指定された条件にマッチします:
<cac:TaxTotal>
<cbc:TaxAmount currencyID="JPY">26000</cbc:TaxAmount>
...
</cac:TaxTotal>
currencyID 属性の値が “JPY” であり、cbc:DocumentCurrencyCode の値も “JPY” であるため、条件が成立します。
したがって、指定された XPath 条件は正しく、XML文書内の該当する要素を選択するための条件として利用できます。
再々確認
cac:TaxTotalの選択条件の[ ]内では、cbc:DocumentCurrencyCodeは、cac:TaxTotalの子要素ではありません
申し訳ありません、誤解がありました。指定された条件 cac:TaxTotal[cac:TaxAmount/@currency = cbc:DocumentCurrencyCode] では、cbc:DocumentCurrencyCode を cac:TaxTotal の子要素として直接使用することはできません。
cac:TaxTotal の子要素である cac:TaxAmount の属性 currencyID と cbc:DocumentCurrencyCode を比較するためには、より複雑なXPath式が必要です。
正しい条件を指定するためには、次のようなXPathを使用します:
cac:TaxTotal[cac:TaxAmount/@currencyID = ../../cbc:DocumentCurrencyCode]
このXPathでは、cac:TaxTotal 要素を選択し、その下の cac:TaxAmount 要素の currencyID 属性を親要素の cbc:DocumentCurrencyCode と比較しています。.. を使用して親要素に移動してから cbc:DocumentCurrencyCode を指定することで、条件を正しく表現しています。
修正された条件を使用すると、次のようになります:
<cac:TaxTotal>
<cbc:TaxAmount currencyID="JPY">26000</cbc:TaxAmount>
...
</cac:TaxTotal>
この cac:TaxTotal 要素は、cbc:DocumentCurrencyCode の値と同じ通貨コードである “JPY” を持つ cac:TaxAmount 要素にマッチします。
お手数をおかけして申し訳ありませんでした。修正後の条件が正しくなりますので、ご利用ください。
再々々確認
/Invoiceの子要素として記述すると
申し訳ありませんが、提供されたXML文書では /Invoice の直下に cac:TaxTotal 要素が存在しないため、 /Invoice の子要素として記述することはできません。
XML文書の構造を考慮して、より正確な条件を指定する必要があります。具体的な要件に基づいて cac:TaxTotal を特定するための正確な条件を提供していただければ、それに基づいて修正されたXPathを提供することができます。
再々々々確認
XML文書は次です
ここで提示したインボイスは、ページ最後の[提示したインボイス]から確認できます。
提供されたXML文書では、cac:TaxTotal 要素を次のXPathで選択できます:
/Invoice/cac:TaxTotal
上記のXPathは /Invoice 要素の直下にある cac:TaxTotal 要素を選択します。
ご質問に基づいて、正確なXPathを提供しましたが、もし他の条件があればそれに応じてXPathを修正してください。
再々々々々確認
cac:TaxTotalの子要素cac:TaxAmountの@currencyIDが/Invoice/cbc:DocumentCurrencyCodeであるものを選択するには
cac:TaxTotal の子要素 cac:TaxAmount の @currencyID が /Invoice/cbc:DocumentCurrencyCode と等しい要素を選択するためのXPathは次のようになります:
/Invoice/cac:TaxTotal[cac:TaxAmount/@currencyID = /Invoice/cbc:DocumentCurrencyCode]
上記のXPathは、 /Invoice 要素の直下にある cac:TaxTotal 要素のうち、その子要素である cac:TaxAmount の @currencyID 属性が /Invoice 要素の直下にある cbc:DocumentCurrencyCode 要素と等しいものを選択します。
ようやく正しく回答してくれました。
配布されたスキーマトロンファイルでは、Invoiceの名前空間識別子にublと指定しているので、スクリプトでは、次のXPathが使用されています。
/ubl:Invoice/cac:TaxTotal[cac:TaxAmount/@currencyID = /ubl:Invoice/cbc:DocumentCurrencyCode]
<ns prefix="ubl" uri="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"/>
提示したインボイス
<?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"
xsi:schemaLocation="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 https://docs.oasis-open.org/ubl/os-UBL-2.1/xsd/maindoc/UBL-Invoice-2.1.xsd">
<!--<cbc:UBLVersionID>2.1</cbc:UBLVersionID>-->
<cbc:CustomizationID>urn:peppol:pint:nontaxinvoice-1@jp-1</cbc:CustomizationID> <!-- IBT-024 - Specification identifier -->
<cbc:ProfileID>urn:peppol:bis:billing</cbc:ProfileID> <!-- IBT-023 - Business process type -->
<cbc:ID>156</cbc:ID> <!-- IBT-001 - Invoice number -->
<cbc:IssueDate>2023-10-24</cbc:IssueDate> <!-- IBT-002 - Invoice issue date -->
<!-- cbc:IssueTime, IBT-168 - Invoice issue time -->
<cbc:DueDate>2023-11-20</cbc:DueDate> <!-- IBT-009 - Payment due date -->
<cbc:InvoiceTypeCode>480</cbc:InvoiceTypeCode> <!-- IBT-003 - Invoice type code -->
<cbc:Note>Ordered at trade show</cbc:Note> <!-- IBT-022 - Invoice note -->
<cbc:DocumentCurrencyCode>JPY</cbc:DocumentCurrencyCode> <!-- IBT-005 - Invoice currency code -->
<cac:InvoicePeriod> <!-- IBG-14 - INVOICING PERIOD -->
<cbc:StartDate>2023-10-18</cbc:StartDate> <!-- IBT-073 - Invoicing period start date -->
<cbc:EndDate>2023-10-18</cbc:EndDate> <!-- IBT-074 - Invoicing period end date -->
<!-- cbc:DescriptionCode, IBT-008 - TAX point date code -->
</cac:InvoicePeriod>
<cac:AccountingSupplierParty> <!-- IBG-04 - SELLER -->
<cac:Party>
<cbc:EndpointID schemeID="0188">1234567890123</cbc:EndpointID> <!-- IBT-034 - Seller electronic address, IBT-034-1 - Scheme identifier -->
<cac:PartyIdentification>
<cbc:ID schemeID="0147">123456:000123:0147:1</cbc:ID> <!-- IBT-029 Seller identifier, IBT-029-1 Scheme identifier -->
</cac:PartyIdentification>
<cac:PartyName>
<cbc:Name>株式会社 〇〇商事</cbc:Name> <!-- IBT-028 - Seller trading name -->
</cac:PartyName>
<cac:PostalAddress> <!-- IBG-05 - SELLER POSTAL ADDRESS -->
<cbc:StreetName>四谷4-29-X</cbc:StreetName> <!-- IBT-035 - Seller address line 1 -->
<cbc:AdditionalStreetName>〇〇商事ビル</cbc:AdditionalStreetName> <!-- IBT-036 - Seller address line 2 -->
<cbc:CityName>新宿区</cbc:CityName> <!-- IBT-037 - Seller city -->
<cbc:PostalZone>1600044</cbc:PostalZone> <!-- IBT-038 - Seller post code -->
<cbc:CountrySubentity>東京都</cbc:CountrySubentity> <!-- IBT-039 - Seller country subdivision -->
<cac:AddressLine>
<cbc:Line>Third address line</cbc:Line> <!-- IBT-162 - Seller address line 3 -->
</cac:AddressLine>
<cac:Country>
<cbc:IdentificationCode>JP</cbc:IdentificationCode> <!-- IBT-040 - Seller country code -->
</cac:Country>
</cac:PostalAddress>
<cac:PartyLegalEntity>
<cbc:RegistrationName>株式会社 〇〇商事</cbc:RegistrationName> <!-- IBT-027 - Seller name -->
<cbc:CompanyID schemeID="0188">1234567890123</cbc:CompanyID> <!-- IBT-030 - Seller legal registration identifier, IBT-030-1 - Scheme identifier -->
<cbc:CompanyLegalForm>Private Limited Company</cbc:CompanyLegalForm> <!-- IBT-033 - Seller additional legal information -->
</cac:PartyLegalEntity>
<cac:Contact> <!-- IBG-06 - SELLER CONTACT -->
<cbc:Name>青木 志郎</cbc:Name> <!-- IBT-041 - Seller contact point -->
<cbc:Telephone>03-3xxx-0001</cbc:Telephone> <!-- IBT-042 - Seller contact telephone number -->
<cbc:ElectronicMail>shirou_aoki@〇〇co.jp</cbc:ElectronicMail> <!-- IBT-043 - Seller contact email address -->
</cac:Contact>
</cac:Party>
</cac:AccountingSupplierParty>
<cac:AccountingCustomerParty> <!-- IBG-07 - BUYER -->
<cac:Party>
<cbc:EndpointID schemeID="0188">3210987654321</cbc:EndpointID> <!-- IBT-049 - Buyer electronic address, IBT-049-1 - Scheme identifier -->
<cac:PartyIdentification>
<cbc:ID schemeID="0147">654321:000321:0147:1</cbc:ID> <!-- IBT-046 - Buyer identifier, IBT-046-1 - Scheme identifier -->
</cac:PartyIdentification>
<cac:PartyName>
<cbc:Name>株式会社 〇〇物産</cbc:Name> <!-- IBT-045 - Buyer trading name -->
</cac:PartyName>
<cac:PostalAddress> <!-- IBG-08 - BUYER POSTAL ADDRESS -->
<cbc:StreetName>北区</cbc:StreetName> <!-- IBT-050 - Buyer address line 1 -->
<cbc:AdditionalStreetName>北十二条西76-X</cbc:AdditionalStreetName> <!-- IBT-051 - Buyer address line 2 -->
<cbc:CityName>札幌市</cbc:CityName> <!-- IBT-052 - Buyer city -->
<cbc:PostalZone>0010012</cbc:PostalZone> <!-- IBT-053 - Buyer post code -->
<cbc:CountrySubentity>北海道</cbc:CountrySubentity> <!-- IBT-054 - Buyer country subdivision -->
<cac:AddressLine>
<cbc:Line>Third line</cbc:Line> <!-- IBT-163 - Buyer address line 3 -->
</cac:AddressLine>
<cac:Country>
<cbc:IdentificationCode>JP</cbc:IdentificationCode> <!-- IBT-055 - Buyer country code -->
</cac:Country>
</cac:PostalAddress>
<cac:PartyTaxScheme>
<cbc:CompanyID>T3210987654321</cbc:CompanyID> <!-- IBT-048 - Buyer TAX identifier -->
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID> <!-- IBT-048, qualifier -->
</cac:TaxScheme>
</cac:PartyTaxScheme>
<cac:PartyLegalEntity>
<cbc:RegistrationName>株式会社 〇〇物産</cbc:RegistrationName> <!-- IBT-044 - Buyer name -->
<cbc:CompanyID schemeID="0147">654321:000321:0147:1</cbc:CompanyID> <!-- IBT-047 - Buyer legal registration identifier, IBT-047-1 - Scheme identifier -->
</cac:PartyLegalEntity>
<cac:Contact> <!-- IBG-09 - BUYER CONTACT -->
<cbc:Name>株式会社 〇〇物産</cbc:Name> <!-- IBT-056 - Buyer contact point -->
<cbc:Telephone>011-757-1xxx</cbc:Telephone> <!-- IBT-057 - Buyer contact telephone number -->
<cbc:ElectronicMail>purchaser@oobussan.co.jp</cbc:ElectronicMail> <!-- IBT-058 - Buyer contact email address -->
</cac:Contact>
</cac:Party>
</cac:AccountingCustomerParty>
<cac:TaxTotal>
<cbc:TaxAmount currencyID="JPY">26000</cbc:TaxAmount> <!-- IBT-110 - Invoice total TAX amount -->
<cac:TaxSubtotal> <!-- IBG-23 - TAX BREAKDOWN -->
<cbc:TaxableAmount currencyID="JPY">260000</cbc:TaxableAmount> <!-- IBT-116 - TAX category taxable amount -->
<cbc:TaxAmount currencyID="JPY">26000</cbc:TaxAmount> <!-- IBT-117 - TAX category tax amount -->
<cac:TaxCategory>
<cbc:ID>S</cbc:ID> <!-- IBT-118 - TAX category code -->
<cbc:Percent>10</cbc:Percent> <!-- IBT-119 - TAX category rate -->
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID> <!-- IBT-118, qualifier -->
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
<cac:TaxSubtotal> <!-- IBG-23 - TAX BREAKDOWN -->
<cbc:TaxableAmount currencyID="JPY">3490</cbc:TaxableAmount> <!-- IBT-116 - TAX category taxable amount -->
<cbc:TaxAmount currencyID="JPY">0</cbc:TaxAmount> <!-- IBT-117 - TAX category tax amount -->
<cac:TaxCategory>
<cbc:ID>E</cbc:ID> <!-- IBT-118 - TAX category code -->
<cbc:Percent>0</cbc:Percent> <!-- IBT-119 - TAX category rate -->
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID> <!-- IBT-118, qualifier -->
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
</cac:TaxTotal>
<cac:LegalMonetaryTotal> <!-- IBG-22 - DOCUMENT TOTALS -->
<cbc:LineExtensionAmount currencyID="JPY">255990</cbc:LineExtensionAmount> <!-- IBT-106 - Sum of Invoice line net amount -->
<cbc:TaxExclusiveAmount currencyID="JPY">263490</cbc:TaxExclusiveAmount> <!-- IBT-109 - Invoice total amount without TAX -->
<cbc:TaxInclusiveAmount currencyID="JPY">289490</cbc:TaxInclusiveAmount> <!-- IBT-112 - Invoice total amount with TAX -->
<cbc:AllowanceTotalAmount currencyID="JPY">179</cbc:AllowanceTotalAmount> <!-- IBT-107 - Sum of allowances on document level -->
<cbc:ChargeTotalAmount currencyID="JPY">7679</cbc:ChargeTotalAmount> <!-- IBT-108 - Sum of charges on document level -->
<cbc:PrepaidAmount currencyID="JPY">0</cbc:PrepaidAmount> <!-- IBT-113 - Paid amount -->
<cbc:PayableRoundingAmount currencyID="JPY">0</cbc:PayableRoundingAmount> <!-- IBT-114 - Rounding amount -->
<cbc:PayableAmount currencyID="JPY">289490</cbc:PayableAmount> <!-- IBT-115 - Amount due for payment -->
</cac:LegalMonetaryTotal>
<cac:InvoiceLine> <!-- IBG-25 - INVOICE LINE -->
<cbc:ID>1</cbc:ID> <!-- IBT-126 - Invoice line identifier -->
<cbc:Note>The equipment has 3 year warranty.</cbc:Note> <!-- IBT-127 - Invoice line note -->
<cbc:InvoicedQuantity unitCode="H87">5</cbc:InvoicedQuantity> <!-- IBT-129 - Invoiced quantity, IBT-130 - Invoiced quantity unit of measure code -->
<cac:InvoicePeriod> <!-- IBG-26 - INVOICE LINE PERIOD -->
<cbc:StartDate>2023-10-18</cbc:StartDate> <!-- IBT-134 - Invoice line period start date -->
<cbc:EndDate>2023-10-18</cbc:EndDate> <!-- IBT-135 - Invoice line period end date -->
</cac:InvoicePeriod>
<cac:Item> <!-- IBG-31 - ITEM INFORMATION -->
<!-- cbc:Description, IBT-154 - Item description -->
<cbc:Name>デスクチェア</cbc:Name> <!-- IBT-153 - Item name -->
<cac:ClassifiedTaxCategory> <!-- IBG-30 - LINE TAX INFORMATION -->
<cbc:ID>S</cbc:ID> <!-- IBT-151 - Invoiced item TAX category code -->
<cbc:Percent>10</cbc:Percent> <!-- IBT-152 - Invoiced item TAX rate -->
<!-- cbc:PerUnitAmount, IBT-166 - Unit TAX -->
<cac:TaxScheme>
<cbc:ID>VAT</cbc:ID> <!-- IBT-167 - Tax Scheme -->
</cac:TaxScheme>
</cac:ClassifiedTaxCategory>
</cac:Item>
<cac:Price> <!-- IBG-29 - PRICE DETAILS -->
<cbc:PriceAmount currencyID="JPY">50000</cbc:PriceAmount> <!-- IBT-146 - Item net price -->
<cbc:BaseQuantity unitCode="H87">1</cbc:BaseQuantity> <!-- IBT-149 - Item price base quantity, IBT-150 - Item price base quantity unit of measure code -->
</cac:Price>
</cac:InvoiceLine>
</Invoice>