- From: Jeni Tennison <jeni@jenitennison.com>
- Date: Fri, 14 Dec 2001 11:26:45 +0000
- To: Prasanna Tadinada <Prasanna.Tadinada@Aceva.com>
- CC: "'xmlschema-dev@w3.org'" <xmlschema-dev@w3.org>
Hi Prasanna,
> Say this is my XML File
>
> <system_header>
> <trace_key>gsfgsrgwrw</trace_key>
> <originator>
> <domain>example</domain>
> <system_name>domain</system_name>
> </originator>
> <create_time>2000-05-24T163330Z</create_time>
> </system_header>
>
> How can i make the Tag <trace_key>gsfgsrgwrw</trace_key> as Optional
> Tag and the Value Optional
>
> How to do it if the tag is <originator>, does the children are to be
> defined optional and nullable.
You can make the trace_key element optional by setting the minOccurs
attribute on the xs:element that declares/refers to it to 0:
<xs:element name="system_header">
<xs:complexType>
<xs:sequence>
<xs:element name="trace_key" type="xs:string" minOccurs="0" />
...
</xs:sequence>
</xs:complexType>
</xs:element>
Assuming that the rest of the content model allows originator and
create_time elements, that would allow:
<system_header>
<originator>
<domain>example</domain>
<system_name>domain</system_name>
</originator>
<create_time>2000-05-24T163330Z</create_time>
</system_header>
There are several ways you could make the trace_key element accept an
empty value.
If you set it to a type that can have an empty string as a lexical
value (for example xs:string, xs:normalizedString, xs:token) then it
happens automatically.
If the trace_key value is of a type where an empty string isn't a
valid value, then you can allow an empty string by creating a union of
the type of the trace_key and a restriction of xs:string which has a
single enumerated value (an empty string). For example, if trace_key
contains values of type xs:NMTOKEN then you could do:
<xs:element name="trace_key">
<xs:simpleType>
<xs:union memberTypes="xs:NMTOKEN">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="" />
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
</xs:element>
This would allow the following:
<system_header>
<trace_key></trace_key>
...
</system_header>
Alternatively, as you suggest, you could use nillable to allow
trace_key to take a nil value. It's only worth doing if trace_key
is of a type for which an empty string is not a legal value, or if you
are using the PSVI and want to have nil values flagged as nil values.
If you have trace_key being a name token, for example:
<xs:element name="trace_key" type="xs:NMTOKEN" nillable="true" />
Then the following is valid:
<system_header>
<trace_key xsi:nil="true"></trace_key>
...
</system_header>
But the following is invalid:
<system_header>
<trace_key></trace_key>
...
</system_header>
Whereas if you have trace_key being a string:
<xs:element name="trace_key" type="xs:string" nillable="true" />
Then both the instances above are valid, but in the first the 'nil'
flag is true for the trace_key element.
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
Received on Friday, 14 December 2001 06:26:55 UTC