XML_Schema: problem with <xs:unique>

A

Aray

I googled for it for few houres, but didn't resolve it, any hints will be
thinkfull.

I want to use the following XSD file to guarantee <element1> is unique, but
it doesn't work.

The following is my XSD file and XML file:

----------- test.xsd ----------------
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.aray.com" targetNamespace="http://www.aray.com"
elementFormDefault="qualified">

<xs:element name="root" type="rootType">
<xs:unique name="PK_element1">
<xs:selector xpath="./element1"></xs:selector>
<xs:field xpath="."></xs:field>
</xs:unique>
</xs:element>

<xs:complexType name="rootType">
<xs:choice>
<xs:group ref="elementGroup" maxOccurs="unbounded" minOccurs="0" />
</xs:choice>
</xs:complexType>

<xs:group name="elementGroup">
<xs:choice>
<xs:element name="element1" type="xs:string" />
<xs:element name="element2" type="xs:string" />
</xs:choice>
</xs:group>

</xs:schema>


----------- test.xml ----------------
<?xml version="1.0" encoding="UTF-8"?>

<root xmlns="http://www.aray.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.aray.com test.xsd" <element1>1</element1>
<element2>1</element2>
<element1>1</element1>
<!--
I expect this xml file is not valide, because the two <element1> has the
same content.
But it is valide
-->
</root>



--
 
A

Arndt Jonasson

Aray said:
I googled for it for few houres, but didn't resolve it, any hints will be
thinkfull.

I want to use the following XSD file to guarantee <element1> is unique, but
it doesn't work.

The following is my XSD file and XML file:

----------- test.xsd ----------------
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.aray.com" targetNamespace="http://www.aray.com"
elementFormDefault="qualified">

<xs:element name="root" type="rootType">
<xs:unique name="PK_element1">
<xs:selector xpath="./element1"></xs:selector>
<xs:field xpath="."></xs:field>
</xs:unique>
</xs:element>

<xs:complexType name="rootType">
<xs:choice>
<xs:group ref="elementGroup" maxOccurs="unbounded" minOccurs="0" />
</xs:choice>
</xs:complexType>

<xs:group name="elementGroup">
<xs:choice>
<xs:element name="element1" type="xs:string" />
<xs:element name="element2" type="xs:string" />
</xs:choice>
</xs:group>

</xs:schema>


----------- test.xml ----------------
<?xml version="1.0" encoding="UTF-8"?>

<root xmlns="http://www.aray.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.aray.com test.xsd"
<element1>1</element1>
<element2>1</element2>
<element1>1</element1>
<!--
I expect this xml file is not valide, because the two <element1> has the
same content.
But it is valide
-->
</root>

You need to specify the namespace in the XPath expression, otherwise
"element1" is taken to be in "no namespace", which is not the case.
That would work if there were no namespace involved at all. Here is the
modified start of your schema:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://www.aray.com" targetNamespace="http://www.aray.com"
xmlns:ns="http://www.aray.com"
elementFormDefault="qualified">

<xs:element name="root" type="rootType">
<xs:unique name="PK_element1">
<xs:selector xpath="./ns:element1"></xs:selector>
<xs:field xpath="."></xs:field>
</xs:unique>
</xs:element>
....

$ xmllint --noout --schema test.xsd test.xml
test.xml:9: element element1: Schemas validity error : Element
'{http://www.aray.com}element1': Duplicate key-sequence ['1'].
test.xml fails to validate
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,995
Messages
2,570,228
Members
46,817
Latest member
AdalbertoT

Latest Threads

Top