[ 
https://issues.apache.org/jira/browse/XERCESJ-1396?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14289046#comment-14289046
 ] 

Sven Meyer edited comment on XERCESJ-1396 at 1/23/15 10:13 AM:
---------------------------------------------------------------

This issue doesn't seem to be fixed. See 
http://stackoverflow.com/questions/28092391/enforcing-xsd-key-and-keyref-constraints-is-not-working-well-with-a-recursive-sc
 for an example.

Another example:

XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
  xmlns:xs="http://www.w3.org/2001/XMLSchema";
  xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning";
  xmlns:ir="http://itude.com/schemas/codegen/ir/java";
  vc:minVersion="1.1"
  targetNamespace="http://itude.com/schemas/codegen/ir/java";
  elementFormDefault="qualified"
  attributeFormDefault="unqualified">

  <xs:element name="source-file" type="ir:SourceFile" />

  <xs:element name="wrapper">
    <xs:alternative test="@type = 'document'" type="ir:DocumentWrapper" />
    <xs:alternative test="@type = 'element'" type="ir:ElementWrapper" />

    <xs:key name="IndexedGetterKey">
      <xs:selector xpath="./ir:indexed-getter" />
      <xs:field xpath="@name" />
    </xs:key>
    <xs:keyref name="IndexedGetterKeyRef" refer="ir:IndexedGetterKey">
      <xs:selector xpath="./ir:default-getter" />
      <xs:field xpath="@indexed-getter-name" />
    </xs:keyref>
    <xs:key name="ListGetterKey">
      <xs:selector xpath="./ir:list-getter" />
      <xs:field xpath="@name" />
    </xs:key>
    <xs:keyref name="ListGetterKeyRef" refer="ir:ListGetterKey">
      <xs:selector xpath="./ir:indexed-getter" />
      <xs:field xpath="@list-getter-name" />
    </xs:keyref>
  </xs:element>

  <xs:complexType name="SourceFile">
    <xs:all>
      <xs:element ref="ir:wrapper" />
    </xs:all>

    <xs:attribute name="name" type="xs:string" use="required" />
  </xs:complexType>

  <xs:complexType name="Wrapper">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="default-getter">
        <xs:alternative test="@type = 'text'" type="ir:DefaultTextGetter" />
        <xs:alternative test="@type = 'element'" type="ir:DefaultElementGetter" 
/>
        <xs:alternative test="@type = 'attribute'" type="ir:AttributeGetter" />
      </xs:element>

      <xs:element name="indexed-getter">
        <xs:alternative test="@type = 'text'" type="ir:IndexedTextGetter" />
        <xs:alternative test="@type = 'element'" type="ir:IndexedElementGetter" 
/>
      </xs:element>

      <xs:element name="list-getter" type="ir:ListGetter" />

      <xs:element ref="ir:wrapper" />

    </xs:choice>

    <xs:attribute name="type" use="required">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="document" />
          <xs:enumeration value="element" />
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="name" type="xs:string" use="required" />
  </xs:complexType>

  <xs:complexType name="DocumentWrapper">
    <xs:complexContent>
      <xs:extension base="ir:Wrapper">
        <xs:attribute name="document-variable-name" type="xs:string" 
use="required" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="ElementWrapper">
    <xs:complexContent>
      <xs:extension base="ir:Wrapper">
        <xs:attribute name="element-variable-name" type="xs:string" 
use="required" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="Getter">
    <xs:attribute name="name" type="xs:string" use="required" />
  </xs:complexType>

  <xs:complexType name="SingleItemGetter">
    <xs:complexContent>
      <xs:extension base="ir:Getter">
        <xs:attribute name="type" use="required">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="text" />
              <xs:enumeration value="element" />
              <xs:enumeration value="attribute" />
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="DefaultTextGetter">
    <xs:complexContent>
      <xs:extension base="ir:SingleItemGetter">
        <xs:attribute name="indexed-getter-name" type="xs:string" 
use="required" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="DefaultElementGetter">
    <xs:complexContent>
      <xs:extension base="ir:SingleItemGetter">
        <xs:attribute name="indexed-getter-name" type="xs:string" 
use="required" />
        <xs:attribute name="return-type" type="xs:string" use="required" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="IndexedTextGetter">
    <xs:complexContent>
      <xs:extension base="ir:SingleItemGetter">
        <xs:attribute name="list-getter-name" type="xs:string" use="required" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="IndexedElementGetter">
    <xs:complexContent>
      <xs:extension base="ir:SingleItemGetter">
        <xs:attribute name="list-getter-name" type="xs:string" use="required" />
        <xs:attribute name="return-type" type="xs:string" use="required" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="ListGetter">
    <xs:complexContent>
      <xs:extension base="ir:Getter">
        <xs:attribute name="element-name" type="xs:string" use="required" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="AttributeGetter">
    <xs:complexContent>
      <xs:extension base="ir:SingleItemGetter">
        <xs:attribute name="attribute-name" type="xs:string" use="required" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
</xs:schema>

XML:
<?xml version="1.0" encoding="UTF-8"?>
<ir:source-file
  xmlns:ir="http://itude.com/schemas/codegen/ir/java";
  name="Trees">
  <ir:wrapper
    type="document"
    name="Trees"
    document-variable-name="treesDocument">
    <ir:default-getter
      name="getRoot"
      type="element"
      return-type="Root"
      indexed-getter-name="getRoot" />
    <ir:indexed-getter
      name="getRoot"
      type="element"
      return-type="Root"
      list-getter-name="getRootElements" />
    <ir:list-getter
      name="getRootElements"
      element-name="root" />

    <ir:wrapper
      type="element"
      name="Root"
      element-variable-name="rootElement">
      <ir:default-getter
        name="getNode"
        type="element"
        return-type="Node"
        indexed-getter-name="getNodex" />
      <ir:indexed-getter
        name="getNode"
        type="element"
        return-type="Node"
        list-getter-name="getNodeElements" />
      <ir:list-getter
        name="getNodeElements"
        element-name="node" />

      <ir:wrapper
        type="element"
        name="Node"
        element-variable-name="nodeElement">
        <ir:default-getter
          name="getValue"
          type="attribute"
          attribute-name="value" />
      </ir:wrapper>
    </ir:wrapper>
  </ir:wrapper>
</ir:source-file>




was (Author: s.meyer):
This issues doesn't seem to be fixed. See 
http://stackoverflow.com/questions/28092391/enforcing-xsd-key-and-keyref-constraints-is-not-working-well-with-a-recursive-sc
 for an example.

Another example:

XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
  xmlns:xs="http://www.w3.org/2001/XMLSchema";
  xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning";
  xmlns:ir="http://itude.com/schemas/codegen/ir/java";
  vc:minVersion="1.1"
  targetNamespace="http://itude.com/schemas/codegen/ir/java";
  elementFormDefault="qualified"
  attributeFormDefault="unqualified">

  <xs:element name="source-file" type="ir:SourceFile" />

  <xs:element name="wrapper">
    <xs:alternative test="@type = 'document'" type="ir:DocumentWrapper" />
    <xs:alternative test="@type = 'element'" type="ir:ElementWrapper" />

    <xs:key name="IndexedGetterKey">
      <xs:selector xpath="./ir:indexed-getter" />
      <xs:field xpath="@name" />
    </xs:key>
    <xs:keyref name="IndexedGetterKeyRef" refer="ir:IndexedGetterKey">
      <xs:selector xpath="./ir:default-getter" />
      <xs:field xpath="@indexed-getter-name" />
    </xs:keyref>
    <xs:key name="ListGetterKey">
      <xs:selector xpath="./ir:list-getter" />
      <xs:field xpath="@name" />
    </xs:key>
    <xs:keyref name="ListGetterKeyRef" refer="ir:ListGetterKey">
      <xs:selector xpath="./ir:indexed-getter" />
      <xs:field xpath="@list-getter-name" />
    </xs:keyref>
  </xs:element>

  <xs:complexType name="SourceFile">
    <xs:all>
      <xs:element ref="ir:wrapper" />
    </xs:all>

    <xs:attribute name="name" type="xs:string" use="required" />
  </xs:complexType>

  <xs:complexType name="Wrapper">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="default-getter">
        <xs:alternative test="@type = 'text'" type="ir:DefaultTextGetter" />
        <xs:alternative test="@type = 'element'" type="ir:DefaultElementGetter" 
/>
        <xs:alternative test="@type = 'attribute'" type="ir:AttributeGetter" />
      </xs:element>

      <xs:element name="indexed-getter">
        <xs:alternative test="@type = 'text'" type="ir:IndexedTextGetter" />
        <xs:alternative test="@type = 'element'" type="ir:IndexedElementGetter" 
/>
      </xs:element>

      <xs:element name="list-getter" type="ir:ListGetter" />

      <xs:element ref="ir:wrapper" />

    </xs:choice>

    <xs:attribute name="type" use="required">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="document" />
          <xs:enumeration value="element" />
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="name" type="xs:string" use="required" />
  </xs:complexType>

  <xs:complexType name="DocumentWrapper">
    <xs:complexContent>
      <xs:extension base="ir:Wrapper">
        <xs:attribute name="document-variable-name" type="xs:string" 
use="required" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="ElementWrapper">
    <xs:complexContent>
      <xs:extension base="ir:Wrapper">
        <xs:attribute name="element-variable-name" type="xs:string" 
use="required" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="Getter">
    <xs:attribute name="name" type="xs:string" use="required" />
  </xs:complexType>

  <xs:complexType name="SingleItemGetter">
    <xs:complexContent>
      <xs:extension base="ir:Getter">
        <xs:attribute name="type" use="required">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="text" />
              <xs:enumeration value="element" />
              <xs:enumeration value="attribute" />
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="DefaultTextGetter">
    <xs:complexContent>
      <xs:extension base="ir:SingleItemGetter">
        <xs:attribute name="indexed-getter-name" type="xs:string" 
use="required" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="DefaultElementGetter">
    <xs:complexContent>
      <xs:extension base="ir:SingleItemGetter">
        <xs:attribute name="indexed-getter-name" type="xs:string" 
use="required" />
        <xs:attribute name="return-type" type="xs:string" use="required" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="IndexedTextGetter">
    <xs:complexContent>
      <xs:extension base="ir:SingleItemGetter">
        <xs:attribute name="list-getter-name" type="xs:string" use="required" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="IndexedElementGetter">
    <xs:complexContent>
      <xs:extension base="ir:SingleItemGetter">
        <xs:attribute name="list-getter-name" type="xs:string" use="required" />
        <xs:attribute name="return-type" type="xs:string" use="required" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="ListGetter">
    <xs:complexContent>
      <xs:extension base="ir:Getter">
        <xs:attribute name="element-name" type="xs:string" use="required" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="AttributeGetter">
    <xs:complexContent>
      <xs:extension base="ir:SingleItemGetter">
        <xs:attribute name="attribute-name" type="xs:string" use="required" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
</xs:schema>

XML:
<?xml version="1.0" encoding="UTF-8"?>
<ir:source-file
  xmlns:ir="http://itude.com/schemas/codegen/ir/java";
  name="Trees">
  <ir:wrapper
    type="document"
    name="Trees"
    document-variable-name="treesDocument">
    <ir:default-getter
      name="getRoot"
      type="element"
      return-type="Root"
      indexed-getter-name="getRoot" />
    <ir:indexed-getter
      name="getRoot"
      type="element"
      return-type="Root"
      list-getter-name="getRootElements" />
    <ir:list-getter
      name="getRootElements"
      element-name="root" />

    <ir:wrapper
      type="element"
      name="Root"
      element-variable-name="rootElement">
      <ir:default-getter
        name="getNode"
        type="element"
        return-type="Node"
        indexed-getter-name="getNodex" />
      <ir:indexed-getter
        name="getNode"
        type="element"
        return-type="Node"
        list-getter-name="getNodeElements" />
      <ir:list-getter
        name="getNodeElements"
        element-name="node" />

      <ir:wrapper
        type="element"
        name="Node"
        element-variable-name="nodeElement">
        <ir:default-getter
          name="getValue"
          type="attribute"
          attribute-name="value" />
      </ir:wrapper>
    </ir:wrapper>
  </ir:wrapper>
</ir:source-file>



> key/keyref does not validate with recursion
> -------------------------------------------
>
>                 Key: XERCESJ-1396
>                 URL: https://issues.apache.org/jira/browse/XERCESJ-1396
>             Project: Xerces2-J
>          Issue Type: Bug
>          Components: XML Schema 1.0 Structures
>    Affects Versions: 2.9.1
>         Environment: Window, with Eclipse and the xerces plug-in is 
> org.apache.xerces_2.9.0.v200805270400
>            Reporter: Chu Minh Toan
>            Assignee: Michael Glavassevich
>
> Hi everyone,
> Is it true that key/keyref does not validate with recursion? I have this 
> question because that when I validate the following xml file, the validation 
> of an element defined with recursion doesn't work. Following is xml and the 
> corresponding xsd file. (I validate xml file with Eclipse and the xerces 
> plug-in is org.apache.xerces_2.9.0.v200805270400). Thanks in advance!
> Toan.
> xsd file :
> <?xml version="1.0" encoding="ISO-8859-1"?>
> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema";>
>  <xsd:element name="CompositeType" type="CompositeType" />
>  <xsd:element name="Model" type="Model">
>   <!-- CompositeTypeKey/KeyRef -->
>   <xsd:key name="CompositeTypeKey">
>    <xsd:selector
>     xpath=".//CompositeType" />
>    <xsd:field xpath="./typeName" />
>   </xsd:key>
>   <xsd:keyref name="CompositeTypeRef" refer="CompositeTypeKey">
>    <xsd:selector
>     xpath=".//Attribute/CompositeTypeReference" />
>    <xsd:field xpath="." />
>   </xsd:keyref>
>  </xsd:element>
>  <xsd:complexType name="CompositeType">
>   <xsd:sequence>
>    <xsd:element minOccurs="0" name="typeName"
>     type="xsd:string" />
>    <xsd:element maxOccurs="unbounded" minOccurs="0"
>     name="Attribute" type="Attribute" />
>   </xsd:sequence>
>  </xsd:complexType>
>  <xsd:complexType name="Attribute">
>   <xsd:sequence>
>    <xsd:element minOccurs="0" name="name" type="xsd:string" />
>    <xsd:choice minOccurs="1">
>     <xsd:element minOccurs="1" maxOccurs="1"
>      name="CompositeType" type="CompositeType" />
>     <xsd:element minOccurs="1" maxOccurs="1"
>      name="CompositeTypeReference" type="xsd:string" />
>    </xsd:choice>
>   </xsd:sequence>
>  </xsd:complexType>
>  <xsd:complexType name="Model">
>   <xsd:sequence>
>    <xsd:element maxOccurs="unbounded" minOccurs="0"
>     name="CompositeType" type="CompositeType" />
>   </xsd:sequence>
>  </xsd:complexType>
> </xsd:schema>
> xml file :
> <?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
> <Model xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
> xsi:noNamespaceSchemaLocation="test.xsd" >
>  <CompositeType>
>   <typeName>Bozo</typeName>
>  </CompositeType>
>  <CompositeType>
>   <typeName>MyData</typeName>
>   <Attribute>
>    <name>b</name>
>    <CompositeTypeReference>Bozo</CompositeTypeReference>
>   </Attribute>
>   <Attribute>
>    <name>d</name>
>    <CompositeType>
>     <typeName>CustomData</typeName>
>    </CompositeType>
>   </Attribute>
>   <Attribute>
>    <name>n</name>
>    <CompositeType>
>     <typeName>NewData</typeName>
>     <Attribute>
>      <name>m</name>
>      <CompositeTypeReference>My</CompositeTypeReference>
>     </Attribute>
>     <Attribute>
>      <name>c</name>
>      <CompositeTypeReference>Custom</CompositeTypeReference>
>     </Attribute>
>    </CompositeType>
>   </Attribute>
>  </CompositeType>
> </Model>
> Notice that when validate if the validation of recursion works, there will be 
> two errors at :
>      <CompositeTypeReference>My</CompositeTypeReference>
>      <CompositeTypeReference>Custom</CompositeTypeReference>
> because the right references are :
>      <CompositeTypeReference>MyData</CompositeTypeReference>
>      <CompositeTypeReference>CustomData</CompositeTypeReference>



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to