I think your discriminator that calls fn:exists(.) is very strange. I would
think that is equivalent to just calling fn:true().
Here's an example of discriminator vs. expression:
<element name="flag" type="xs:boolean"..../>
later we have an optional element presence controlled by that flag.
<element name="data" type="xs:int" minOccurs="0"
dfdl:occursCountKind="implicit">
<annotation><appinfo source="http://www.ogf.org/dfdl/">
<dfdl:discriminator>{ ../flag }</dfdl:discriminator>
</appinfo></annotation>
</element>
The discriminator says this occurrence exists if the flag says so.
But we can redo this without any points of uncertainty like this:
<element name="data" type="xs:int" minOccurs="0"
dfdl:occursCountKind="expression"
dfdl:occursCount="{ if (../flag) then 1 else 0 }"/>
No discriminator. We just look at the flag and decide the quantity.
I sometimes model flags not as booleans, but as unsigned int with value 0 or 1
so as to have them literally be counts of the subsequent elements whose
presence they control.
________________________________
From: Costello, Roger L. <[email protected]>
Sent: Tuesday, October 8, 2019 11:32 AM
To: [email protected] <[email protected]>
Subject: Re: How to use dfdl:discriminator with an array?
Thanks Mike. That is a great example of using a discriminator in an array!
But, but, but, ….
Yesterday you recommended using dfdl:occursCountKind="expression" rather than
discriminators in an array. I am seeking an example to illustrate your
recommendation.
I think that I created an example. The below DFDL schema uses a discriminator
in an array. It would be better implemented using
dfdl:occursCountKind="expression". Do you agree?
<xs:element name="name" type="xs:string" maxOccurs="unbounded">
<xs:annotation>
<xs:appinfo source="http://www.ogf.org/dfdl/">
<dfdl:discriminator test="{ fn:exists(.) }" />
</xs:appinfo>
</xs:annotation>
</xs:element>
From: Beckerle, Mike <[email protected]>
Sent: Tuesday, October 8, 2019 11:21 AM
To: [email protected]
Subject: [EXT] Re: How to use dfdl:discriminator with an array?
I have a super example:
In the mil-std-2045 schema (which is public, on github), there is a fantastic
very non-trivial discriminator.
Line 141 of milstd2045_application_header.dfdl.xsd
<xs:element maxOccurs="unbounded" minOccurs="1" name="recipient_address_group"
dfdl:lengthKind="implicit" dfdl:occursCountKind="implicit">
<xs:complexType>
<xs:sequence>
<xs:sequence>
<xs:annotation>
<xs:appinfo source="http://www.ogf.org/dfdl/">
<dfdl:discriminator>{ if (dfdl:occursIndex() eq 1) then
fn:true() else
../recipient_address_group[dfdl:occursIndex()-1]/GRI
eq 1 }
</dfdl:discriminator>
</xs:appinfo>
</xs:annotation>
</xs:sequence>
.... rest of the element contents ...
</xs:element>
This discriminator says: look at the GRI flag in the prior element. If true
then this element exists!
These array elements are repeating, but each has a flag that indicates whether
this is the last element of the array, or there is (at least) one more after
this. Such an array always has at least one element, but then each element
tells you if the next one will be present or not.
This is not a discriminator you can replace by any sort of one-time expression.
It has to be done as a discriminator, evaluated one by one as each array
element is created.
...mikeb
________________________________
From: Costello, Roger L. <[email protected]<mailto:[email protected]>>
Sent: Tuesday, October 8, 2019 10:39 AM
To: [email protected]<mailto:[email protected]>
<[email protected]<mailto:[email protected]>>
Subject: How to use dfdl:discriminator with an array?
Hello DFDL community,
Yesterday Mike said this:
* A dfdl:discriminator says if something is true, then … optional/array
uncertainty is closed off, and no longer uncertain.
* I avoid using discriminators because I find … for optional/array elements
using dfdl:occursCountKind="expression" are superior.
Would you provide an example of using dfdl:discriminator with an
optional/array, please?
/Roger