Hi Grant,
Grant Robertson <bogus@bogus.invalidwrites:
Quote:
If I use the 'any' element in my schema to allow elements from another
schema to be used in instance documents based on my schema, is there a
way to force that the contents of that element must be an entire,
complete instance document for that other schema?
|
If the schema for the namespace that you allow in your wildcard only
defines one global element that represents a complete document of
that vocabulary, then yes.
Quote:
Let's say I have the following schema:
>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="BogusElement" type="BogusType"/>
<xs:complexType name="BogusType">
<xs:sequence>
<xs:any namespace="http://www.w3.org/1999/xhtml"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
>
It has only the one element BogusElement and it can contain only the one
child element from the XHTML schema. Does this force the BogusElement
element in the instance document to contain a complete XHTML document
including headers or would
>
<?xml version="1.0" encoding="UTF-8"?>
<BogusElement
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="Untitled1.xsd"
xmlns:xhtml="http://www.w3.org/1999/xhtml">
<xhtml:strong>Bolded Text.</xhtml:strong>
</BogusElement>
>
be a valid document under the above schema?
|
It depends on the schema that defines the XHTML vocabulary. If it defines
strong as a global element then the above instance will be valid.
Quote:
To complicate things further: Let's say I wanted that element to contain
only one of a list of valid, complete documents such as either a complete
html document OR a complete XHTML document OR a complete DocBook
document, all with headers. How would I do that?
|
I think if you have a predefined set of "content documents" then using
the choice construct might be a good idea. Alternatively, you can
introduce another level of indirection. With this approach you change
BogusType to read like so:
<xs:complexType name="BogusType">
<xs:sequence>
<xs:any namespace="http://www.example.com/envelop-content"/>
</xs:sequence>
</xs:complexType>
In other words, you only allow elements in place of a wildcard to be
from a namespace (or namespaces) that you control. Then you define
the envelop-content vocabulary like this:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xhtml="http://www.w3.org/1999/xhtml"
targetNamespace="http://www.example.com/envelop-content">
<xs:import ... import XHTML schema ...>
<xs:element name="xhtml-content">
<xs:complexType>
<xs:sequence>
<xs:element ref="xhtml::html"/>
</xs:sequence>
</xs:complexType>
</xs:element>
... Other *-content elements
</xs:schema>
hth,
-boris
--
Boris Kolpackov
Code Synthesis Tools CC
http://www.codesynthesis.com
Open-Source, Cross-Platform C++ XML Data Binding