[
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: [email protected]
For additional commands, e-mail: [email protected]