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 "George Bina (JIRA)" <xe...@xml.apache.org> on 2010/06/09 16:03:13 UTC

[jira] Commented: (XERCESJ-1138) More than one values for a key not detected

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

George Bina commented on XERCESJ-1138:
--------------------------------------

This issue is fixed by the implementation of XPathMatcher attached to XERCESJ-832
https://issues.apache.org/jira/secure/attachment/12446685/XPathMatcher.java

> More than one values for a key not detected
> -------------------------------------------
>
>                 Key: XERCESJ-1138
>                 URL: https://issues.apache.org/jira/browse/XERCESJ-1138
>             Project: Xerces2-J
>          Issue Type: Bug
>          Components: XML Schema 1.0 Structures
>    Affects Versions: 2.7.1
>            Reporter: George Cristian Bina
>
> For a schema like below
> <?xml version="1.0" encoding="UTF-8"?>
> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
>   <xs:element name="test">
>     <xs:complexType>
>       <xs:sequence maxOccurs="unbounded">
>         <xs:element ref="a"/>
>       </xs:sequence>
>     </xs:complexType>
>     <xs:key name="aID">
>       <xs:selector xpath=".//a"/>
>       <xs:field xpath="./@id1|./@id2"/>
>     </xs:key>
>   </xs:element>
>   <xs:element name="a">
>     <xs:complexType>
>       <xs:choice minOccurs="0" maxOccurs="unbounded">
>         <xs:element ref="a"/>
>         <xs:element ref="id1"/>
>         <xs:element ref="id2"/>
>       </xs:choice>
>       <xs:attribute name="id1" use="optional"/>
>       <xs:attribute name="id2" use="optional"/>
>     </xs:complexType>
>   </xs:element>
>   <xs:element name="id1" type="xs:string"/>
>   <xs:element name="id2" type="xs:string"/>
> </xs:schema> 
> Xerces reports the following document as valid:
> <test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test.xsd">
>   <a id2="v1" id1="v2"></a>
> </test> 
> Instead of signaling the duplicate key value error:
> SystemID: E:\workspace\oXygen\samples\test.xml
> Location: 2:24
> Description: E Identity constraint error:  field "./@id1|./@id2" matches more than one value within the scope of its selector; fields must match unique values.
> The problem is in XPathMatcher when a Path matches an attribute the matched() method is not called if there is a preceding path that was matched, in this case the matched method will be called only for the first Path ./@id1 and not for the second Path ./@id2.
> Here it is the relevant code in the XPathMatcher class:
>                            if (fCurrentStep[i] == steps.length) {
>                                 fMatched[i] = MATCHED_ATTRIBUTE;
>                                 int j=0;
>                                 for(; j<i && ((fMatched[j] & MATCHED) != MATCHED); j++);
>                                 if(j==i) {
>                                     AttributePSVI attrPSVI = (AttributePSVI)attributes.getAugmentations(aIndex).getItem(Constants.ATTRIBUTE_PSVI);
>                                     fMatchedString = attrPSVI.getActualNormalizedValue();
>                                     matched(fMatchedString, attrPSVI.getActualNormalizedValueType(), attrPSVI.getItemValueTypes(), false);
>                                 }
>                             }
>                             
> The matched method should be always called to allow the detection of the duplicate value that is performed in the XMLSchemaValidator (in the ValueStore). So the above code should be replaced with"
>                             if (fCurrentStep[i] == steps.length) {
>                                 fMatched[i] = MATCHED_ATTRIBUTE;
>                                 AttributePSVI attrPSVI = (AttributePSVI)attributes.getAugmentations(aIndex).getItem(Constants.ATTRIBUTE_PSVI);
>                                 fMatchedString = attrPSVI.getActualNormalizedValue();
>                                 matched(fMatchedString, attrPSVI.getActualNormalizedValueType(), attrPSVI.getItemValueTypes(), false);
>                             }
>                            
> Best Regards,
> George

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: j-dev-unsubscribe@xerces.apache.org
For additional commands, e-mail: j-dev-help@xerces.apache.org