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]>
Sent: Tuesday, October 8, 2019 10:39 AM
To: [email protected] <[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