- From: George Cristian Bina <george@oxygenxml.com>
- Date: Wed, 26 Jul 2006 16:41:40 +0300
- To: Debora Vanni <debora.vanni@tvblob.com>
- Cc: xmlschema-dev@w3.org
Hi Debora,
You cannot do that with XML Schema alone, but you can do that with XML
Schema with embedded Schematron rules. You can find below a working example:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="test">
<xs:complexType>
<xs:sequence>
<xs:element ref="special-tag"/>
<xs:element ref="host" minOccurs="0"/>
<xs:element ref="port" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="special-tag">
<xs:annotation>
<xs:appinfo>
<pattern xmlns="http://www.ascc.net/xml/schematron"
name="testSpecialTag">
<rule context="special-tag[@value='OUR']">
<assert test="not(../host) and not(../port)">host and post
should not be present because
value is 'OUR'</assert>
</rule>
<rule context="special-tag[@value='TCP']">
<assert test="../host and ../port">host and post should be
present because value is
'TCP'</assert>
</rule>
</pattern>
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:attribute name="type" use="required" type="xs:NCName"/>
<xs:attribute name="value" use="required">
<xs:simpleType>
<xs:restriction base="xs:NCName">
<xs:enumeration value="TCP"/>
<xs:enumeration value="OUR"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="host">
<xs:complexType>
<xs:attribute name="type" use="required" type="xs:NCName"/>
<xs:attribute name="value" use="required" type="xs:NMTOKEN"/>
</xs:complexType>
</xs:element>
<xs:element name="port">
<xs:complexType>
<xs:attribute name="type" use="required" type="xs:NCName"/>
<xs:attribute name="value" use="required" type="xs:integer"/>
</xs:complexType>
</xs:element>
</xs:schema>
On an invalid instance document like
<test>
<special-tag type="string" value="OUR"/>
<host type="string" value="192.168.72.26"/>
<port type="int" value="10202"/>
</test>
you will get an error
SystemID: C:\george\workspace\oXygen\samples\test.xml
Location: 2:0
Description: host and post should not be present because value is 'OUR'
(not(../host) and not(../port))
Best Regards,
George
---------------------------------------------------------------------
George Cristian Bina
<oXygen/> XML Editor, Schema Editor and XSLT Editor/Debugger
http://www.oxygenxml.com
Debora Vanni wrote:
> Hi all!
> I have this problem on validation with xsd.
> The xml file has a particular tag: when his value is "TCP" the xml file
> must have other two tags, when his value is "OUR" there should be no
> other tags.
> So the xml should be either
>
> <special-tag type="string" value="TCP"/>
> <host type="string" value="192.168.72.26"/>
> <port type="int" value="10202"/>
>
> or
> <special-tag type="string" value="OUR"/>
>
> Is there some way to do this with xsd?
> Thank you very much for your help!
> Debora
>
>
>
>
Received on Wednesday, 26 July 2006 13:38:54 UTC