[DFDL-WG] Clarify behaviour of an empty xs:choice
Mike Beckerle
mbeckerle.dfdl at gmail.com
Mon Feb 25 10:19:52 EST 2013
I like your forced failure device in your extension choice object.
Sounds like we're inconsistent in the spec as to whether an xs:choice can
be empty or not. Having no branches is inconsistent with the position that
all branches cannot have minOccurs='0'.
The more conservative design choice here is to disallow empty choices.
...mike
On Mon, Feb 25, 2013 at 10:01 AM, Steve Hanson <smh at uk.ibm.com> wrote:
> The DFDL spec says that all branches in an xs:choice must not have
> minOccurs '0' and if all branches are processed without a match then it is
> a processing error. But the DFDL spec also allows the creation of an empty
> xs:choice, that is, a choice without any branches at all. Some questions
> arise:
>
> 1) What happens when choiceLengthKind is 'explicit' - SDE ? Insist that
> choiceLength is '0' ?
>
> 2) What happens if choiceBranchRef is specified ?
>
> 3) Assuming any syntax matches, an empty choice always parses
> successfully. Read on...
>
> I have been using an empty choice for modeling data formats where
> user-defined extensions are permitted. This was the mechanism agreed upon
> by the WG to model this scenario in the absence of xs:any support in DFDL
> 1.0. Here's an example from a schema that models the TLOG retail format:
>
> *<xsd:choice>*
> <xsd:element *ref*="TransactionRecord00"/>
> <xsd:element *ref*="TransactionRecord01"/>
> <xsd:element *ref*="TransactionRecord04"/>
> <xsd:element *ref*="TransactionRecord05"/>
> <xsd:element *ref*="TransactionRecord98"/>
> <xsd:group *ref*="choice_Custom"/>
> *</xsd:choice>*
>
>
> <!-- Group for all user-defined records -->
> <xsd:group name="choice_Custom">
> *<xsd:choice>*
> <!-- Insert elements here -->
>
> *</xsd:choice>*
> *</xsd:group>*
>
> The intent is that the user adds his own records in the choice_Custom
> group. If an unknown record is parsed that fails to match any of the
> pre-defined records and any of the user-defined records, it will cause a
> processing error.
>
> However that didn't actually work. Because choiceCustom is initially
> empty, it will parse successfully against any input and in doing so
> discriminate the outer choice, meaning the processing error is not thrown.
> As soon as an element is added to choice_Custom, then it behaves as
> originally intended - an unknown record causes a processing error in
> choice_Custom, so the outer choice never discriminates.
>
> To work around this I added an assert to the choice to ensure it fails
> when empty.
>
> <!-- Group for all user-defined records -->
> <xsd:group name="choice_Custom">
> *<xsd:choice>*
> <!-- Insert elements here -->
>
> <!-- If we get here ensure choice fails -->
> *<xsd:sequence>*
> *<xsd:annotation>*<xsd:appinfo source="
> http://www.ogf.org/dfdl/">
> * <dfdl:assert>{fn:false()}
> </dfdl:assert>*
> *</xsd:appinfo></xsd:annotation>*
> *</xsd:sequence>*
> *</xsd:choice>*
> *</xsd:group>*
>
> So is an empty choice a genuinely useful construct to allow? It didn't
> actually help my scenario in 3). Are there any where it would make sense?
>
> Regards
>
> Steve Hanson
> Architect, Data Format Description Language (DFDL)
> Co-Chair, *OGF DFDL Working Group* <http://www.ogf.org/dfdl/>
> IBM SWG, Hursley, UK*
> **smh at uk.ibm.com* <smh at uk.ibm.com>
> tel:+44-1962-815848
> Unless stated otherwise above:
> IBM United Kingdom Limited - Registered in England and Wales with number
> 741598.
> Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU
>
> --
> dfdl-wg mailing list
> dfdl-wg at ogf.org
> https://www.ogf.org/mailman/listinfo/dfdl-wg
>
--
Mike Beckerle | OGF DFDL Workgroup Co-Chair | Tresys Technology |
www.tresys.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.ogf.org/pipermail/dfdl-wg/attachments/20130225/6075ffff/attachment.html>
More information about the dfdl-wg
mailing list