Re: [xml-dev] Understanding the scope of XML catalog

From
Imsieke, Gerrit, le-tex <>
To
Date
2019-03-02T14:53:28Z
ID
<>
Thread
Re: [xml-dev] Understanding the scope of XML catalog
On 02.03.2019 14:38, G. Ken Holman wrote:
> I wonder if Norm could be convinced to consider broadening the scope in 
> a new XML Catalog 1.2?

But even if he conceived such a namespace URI to schema location 
mapping, validating parsers still need to be instructed to use the mapping.

But since you mention Norm: He happens to be the editor of the XProc 
specs and the author of the XProc processor XML Calabash.

With the catalog entry that you suggested, and with a small XProc 
pipeline, we can actually resolve the namespace URI of the top-level UBL 
document element to the corresponding schema!

This goes into the catalog that Calabash uses:

<uri name="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
     uri="../maindoc/UBL-Invoice-2.2.xsd"/>

The XML catalog is in the file xmlcatalog/catalog.xml, which is supplied 
to Calabash as seen in this front-end bash script for invoking Calabash: 
https://github.com/transpect/calabash-frontend/blob/master/calabash.sh

In addition to the invoice schema in maindoc/, there is a mirror of the 
https://docs.oasis-open.org/ubl/os-UBL-2.2/xsd/common/ directory 
alongside maindoc/

This is ublval.xpl:

<p:declare-step xmlns:p="http://www.w3.org/ns/xproc" version="1.0">
   <p:input port="source" sequence="true" primary="true"/>
   <p:output port="result" sequence="true" primary="true"/>

   <p:for-each name="validation-iteration">
     <p:load name="load-schema">
       <p:with-option name="href" select="namespace-uri(/*)"/>
     </p:load>
     <p:sink/>
     <p:validate-with-xml-schema assert-valid="true">
       <p:input port="source">
         <p:pipe port="current" step="validation-iteration"/>
       </p:input>
       <p:input port="schema">
         <p:pipe port="result" step="load-schema"/>
       </p:input>
     </p:validate-with-xml-schema>
   </p:for-each>

</p:declare-step>

This is an input document:

<Invoice xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 
xsi:schemaLocation="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2 
../maindoc/UBL-Invoice-2.2.xsd"
   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">
   <cbc:UBLVersionID>2.2</cbc:UBLVersionID>
   <cbc:ID>TOSL108</cbc:ID>
   <cbc:IssueDate>2009-12-15</cbc:IssueDate>
   <cac:AccountingSupplierParty/>
   <cac:AccountingCustomerParty/>
   <cac:PayeeParty/>
   <cac:BuyerCustomerParty/>
   <cac:SellerSupplierParty/>
   <cac:TaxRepresentativeParty/>
   <cac:Delivery/>
   <cac:DeliveryTerms/>
   <cac:PaymentMeans>
     <cbc:PaymentMeansCode/>
   </cac:PaymentMeans>
   <cac:PaymentTerms/>
</Invoice>

This is the XML Calabash invocation (using the front-end bash script 
linked above):

calabash/calabash.sh -i source=invoice.xml ublval.xpl

This is the result:

ERROR: err:XC0053:XProc error err:XC0053
ERROR:     cause: cvc-complex-type.2.4.b: The content of element 
'Invoice' is not complete. One of 
'{"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2":PaymentTerms, 
"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2":PrepaidPayment, 
"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2":AllowanceCharge, 
"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2":TaxExchangeRate, 
"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2":PricingExchangeRate, 
"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2":PaymentExchangeRate, 
"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2":PaymentAlternativeExchangeRate, 
"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2":TaxTotal, 
"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2":WithholdingTaxTotal, 
"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2":LegalMonetaryTotal}' 
is expected.
ERROR: It is a dynamic error if the assert-valid option is true and the 
input document is not valid.

If you don’t want the XML validation to fail but to issue a report, you 
can use p:try/p:catch. I can send you a more elaborate pipeline if you like.

The main trick is: In XProc, but also in other scripting languages that 
provide the XPath function namespace-uri(), you can read the namespace 
URI of the top-level element and, thanks to the catalog, resolve it 
immeadiately to a local copy of your schema.

You are welcome.

Gerrit


-- 
Gerrit Imsieke
Geschäftsführer / Managing Director
le-tex publishing services GmbH
Weissenfelser Str. 84, 04229 Leipzig, Germany
Phone +49 341 355356 110, Fax +49 341 355356 510
, http://www.le-tex.de

Registergericht / Commercial Register: Amtsgericht Leipzig
Registernummer / Registration Number: HRB 24930

Geschäftsführer / Managing Directors:
Gerrit Imsieke, Svea Jelonek, Thomas Schmidt