Hi Steve,

> When you complete your CSV schema, 
> it would be nice if you could add it to 
> the DFDLSchemas CSV repo.

Yes, that is what I plan to do!

/Roger

-----Original Message-----
From: Steve Lawrence <[email protected]> 
Sent: Monday, November 11, 2019 7:12 AM
To: [email protected]
Subject: [EXT] Re: How to check that every record in a CSV file has the same 
number of fields?

Another option is to use dfdl:occursCount with an expression. That's what we do 
in the csv schemas on DFDLSchemas:

https://github.com/DFDLSchemas/CSV/blob/master/src/main/resources/com/tresys/csv/xsd/csvHeaderEnforced.dfdl.xsd

Note, when you complete your CSV schema, it would be nice if you could add it 
to the DFDLSchemas CSV repo. The goal for this repo is to contain schemas for 
all the different "variants" of CSV, so an RFC compliant schema would be very 
welcome.


On 11/10/19 4:34 PM, Sloane, Brandon wrote:
> DFDL only supports a limited subset of XPath. In particular, it does 
> not support any looping construct like you are using in your XPath.
> 
> What I would do instead is put an assertion on each record, checking 
> that it has the same number of fields as the first record.
> ----------------------------------------------------------------------
> ----------
> *From:* Costello, Roger L. <[email protected]>
> *Sent:* Sunday, November 10, 2019 9:27 AM
> *To:* [email protected] <[email protected]>
> *Subject:* How to check that every record in a CSV file has the same 
> number of fields?
> 
> Hi Folks,
> 
> The RFC for CSV says that every record in a CSV file should have the 
> same number of fields. That check is easily expressed in XPath:
> 
> every $i in *[position() gt 1] satisfies count($i/*) eq
> count($i/preceding-sibling::*[1]/*)
> 
> So I added that XPath expression in an assert for the root element (csv):
> 
> <xs:elementname="csv">
> <xs:annotation>
> <xs:appinfosource="http://www.ogf.org/dfdl/";>
> <dfdl:asserttest="{ every $i in *[position() gt 1] satisfies 
> fn:count($i/*) eq
> fn:count($i/preceding-sibling::*[1]/*) }"
>                  message="{'Each record should contain the same number 
> of fields.'}"/> </xs:appinfo> </xs:annotation>
>      ...
> 
> But that yields this error message:
> 
> [error] Schema Definition Error: Unable to parse expression. Message: '}' 
> expected but '$' found
> 
> What is the correct way to implement the check that all records have 
> the same number of fields?
> 
> /Roger
> 

Reply via email to