Uploaded image for project: 'Xerces2-J'
  1. Xerces2-J
  2. XERCESJ-1285

Restriction of choice/sequence with non-unity cardinality and any ##any fail with rcase-Recurse[Lax].2

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Minor
    • Resolution: Unresolved
    • 2.9.1
    • None
    • None
    • WindowsXP, Java 1.5.0-b64

    Description

      If a base type includes an any declaration, within a sequence or choice that has non-unity cardinality, restrictions that specify more than one particle in place of the any declaration fail, even though their cardinality should be allowed as a sequence derivation based on NSRecurseCheckCardinality.

      This does not occur when the cardinality of the base sequence or choice is 1 (i.e. minOccurs and maxOccurs both equal 1).

      Using Sandy's notation for single-element choices or sequences:
      base_c = (##any*|)*
      base_s = (##any*,)*

      Restrictions of these types that include multiple particles in place of the any fail.
      restriction_c = (X|Y)*
      restriction_s = (X,Y)*

      You can dupe Xerces into passing the restriction by adding two layers of extra groupings:
      restriction_c = (((X|Y|),)|)* – passes
      restriction_s = (((X,Y,)|),)* – passes

      But a simple grouping gets removed since it is a useless particle:
      restriction_c = ((X|Y|)|)* – fails
      restriction_s = ((X,Y,),)* – fails

      This probably has something to do with the way that Xerces removes redundant particles.

      Here's a schema that fails on all restrictions except the dupe ones (those with _p in the restriction type name). You can remove all instances of element Q to simplify the content – it's there to show that this occurs only when part of the group is replaced. (My apologies for the size of this, there are a few cases to demonstrate).

      I get 18 total errors from this schema, but each restriction error results in two error messages from Xerces: rcase-Recurse.2 or rcase-RecurseLax.2 and derivation-ok-restriction.5.4.2.
      ~~
      <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
      targetNamespace="urn:restrict2" xmlns="urn:restrict2">

      <xs:complexType name="base_s">
      <xs:complexContent>
      <xs:restriction base="xs:anyType">
      <xs:sequence minOccurs="0">
      <xs:element name="Q"/>
      <xs:any namespace="##any"
      minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
      </xs:restriction>
      </xs:complexContent>
      </xs:complexType>

      <xs:complexType name="restriction_s">
      <xs:complexContent>
      <xs:restriction base="base_s">
      <xs:sequence minOccurs="0">
      <xs:element name="Q"/>
      <xs:element name="X"/>
      <xs:element name="Y"/>
      </xs:sequence>
      </xs:restriction>
      </xs:complexContent>
      </xs:complexType>

      <xs:complexType name="restriction_s2">
      <xs:complexContent>
      <xs:restriction base="base_s">
      <xs:sequence minOccurs="0">
      <xs:element name="Q"/>
      <xs:sequence>
      <xs:element name="X"/>
      <xs:element name="Y"/>
      </xs:sequence>
      </xs:sequence>
      </xs:restriction>
      </xs:complexContent>
      </xs:complexType>

      <xs:complexType name="restriction_s_1">
      <xs:complexContent>
      <xs:restriction base="base_s">
      <xs:sequence>
      <xs:element name="Q"/>
      <xs:element name="X"/>
      <xs:element name="Y"/>
      </xs:sequence>
      </xs:restriction>
      </xs:complexContent>
      </xs:complexType>

      <xs:complexType name="restriction_s_p">
      <xs:complexContent>
      <xs:restriction base="base_s">
      <xs:sequence minOccurs="0">
      <xs:element name="Q"/>
      <xs:choice>
      <xs:sequence>
      <xs:element name="X"/>
      <xs:element name="Y"/>
      </xs:sequence>
      </xs:choice>
      </xs:sequence>
      </xs:restriction>
      </xs:complexContent>
      </xs:complexType>

      <xs:complexType name="base_c">
      <xs:complexContent>
      <xs:restriction base="xs:anyType">
      <xs:choice minOccurs="0">
      <xs:element name="Q"/>
      <xs:any namespace="##any"
      minOccurs="0" maxOccurs="unbounded"/>
      </xs:choice>
      </xs:restriction>
      </xs:complexContent>
      </xs:complexType>

      <xs:complexType name="restriction_c">
      <xs:complexContent>
      <xs:restriction base="base_c">
      <xs:choice minOccurs="0">
      <xs:element name="Q"/>
      <xs:element name="X"/>
      <xs:element name="Y"/>
      </xs:choice>
      </xs:restriction>
      </xs:complexContent>
      </xs:complexType>

      <xs:complexType name="restriction_c2">
      <xs:complexContent>
      <xs:restriction base="base_c">
      <xs:choice minOccurs="0">
      <xs:element name="Q"/>
      <xs:choice>
      <xs:element name="X"/>
      <xs:element name="Y"/>
      </xs:choice>
      </xs:choice>
      </xs:restriction>
      </xs:complexContent>
      </xs:complexType>

      <xs:complexType name="restriction_c_1">
      <xs:complexContent>
      <xs:restriction base="base_c">
      <xs:choice>
      <xs:element name="Q"/>
      <xs:element name="X"/>
      <xs:element name="Y"/>
      </xs:choice>
      </xs:restriction>
      </xs:complexContent>
      </xs:complexType>

      <xs:complexType name="restriction_c_p">
      <xs:complexContent>
      <xs:restriction base="base_c">
      <xs:choice minOccurs="0">
      <xs:element name="Q"/>
      <xs:sequence>
      <xs:choice>
      <xs:element name="X"/>
      <xs:element name="Y"/>
      </xs:choice>
      </xs:sequence>
      </xs:choice>
      </xs:restriction>
      </xs:complexContent>
      </xs:complexType>

      <xs:complexType name="base_su">
      <xs:complexContent>
      <xs:restriction base="xs:anyType">
      <xs:sequence maxOccurs="unbounded">
      <xs:element name="Q"/>
      <xs:any namespace="##any"
      minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
      </xs:restriction>
      </xs:complexContent>
      </xs:complexType>

      <xs:complexType name="restriction_su">
      <xs:complexContent>
      <xs:restriction base="base_su">
      <xs:sequence maxOccurs="unbounded">
      <xs:element name="Q"/>
      <xs:element name="X"/>
      <xs:element name="Y"/>
      </xs:sequence>
      </xs:restriction>
      </xs:complexContent>
      </xs:complexType>

      <xs:complexType name="restriction_su_1">
      <xs:complexContent>
      <xs:restriction base="base_su">
      <xs:sequence>
      <xs:element name="Q"/>
      <xs:element name="X"/>
      <xs:element name="Y"/>
      </xs:sequence>
      </xs:restriction>
      </xs:complexContent>
      </xs:complexType>

      <xs:complexType name="restriction_su_p">
      <xs:complexContent>
      <xs:restriction base="base_su">
      <xs:sequence>
      <xs:element name="Q"/>
      <xs:choice>
      <xs:sequence>
      <xs:element name="X"/>
      <xs:element name="Y"/>
      </xs:sequence>
      </xs:choice>
      </xs:sequence>
      </xs:restriction>
      </xs:complexContent>
      </xs:complexType>
      </xs:schema>

      Attachments

        1. test1.xsd
          5 kB
          Martin Thomson

        Activity

          People

            sandygao@ca.ibm.com Sandy Gao
            emptyweevil Martin Thomson
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated: