You are viewing a plain text version of this content. The canonical link for it is here.
Posted to j-dev@xerces.apache.org by "Sven Meyer (JIRA)" <xe...@xml.apache.org> on 2015/01/23 11:13:35 UTC

[jira] [Commented] (XERCESJ-1396) key/keyref does not validate with recursion

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

Sven Meyer commented on XERCESJ-1396:
-------------------------------------

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: j-dev-unsubscribe@xerces.apache.org
For additional commands, e-mail: j-dev-help@xerces.apache.org