Next in thread → Next in month →

Re: [xml-dev] Schemas and mixed content with Relax NG and W3C XML Schema

From
Andrew Welch <>
To
Philippe Poulard <>
Date
2008-07-16T15:55:14Z
ID
<>
Thread
Re: [xml-dev] Schemas and mixed content with Relax NG and W3C XML Schema
(replying on-list this time)

> I know that with DTDs, when a text is allowed with elements, the best we can
> do is to allow it everywhere between other elements that can be repeated at
> any place in the text :
>
> <!ELEMENT p (#PCDATA|a|ul|b|i|em)*>
>
> unfortunately, we can't enforce the text to be at a given place :
>
> <person>Mr <firstname>John</firstname><lastname>Doe</lastname></person>
>
> the following DTD is invalid, but explain what we'd like to have :
> <!ELEMENT person (#PCDATA,firstname,lastname)>

How about (xsd 1.1):

<xs:complexType name="person" mixed="true">
 <xs:sequence>
   <xs:element ref="firstname"/>
   <xs:element ref="lastname"/>
 </xs:sequence>
 <xs:assert test="text() eq node()[1]"/>
</xs:complexType>

...which should check that the only text() node is the first child.

I guess you could also do:

<xs:assert test="not(text() >> firstname)"/>

to make sure there are no text() nodes after the firstname element...

If you wanted to enforce the positions of the text nodes you could do:

<xs:assert test="text()[1] is node()[1]"/>
<xs:assert test="text()[2] is node()[3]"/>

etc



-- 
Andrew Welch
http://andrewjwelch.com
Kernow: http://kernowforsaxon.sf.net/
Next in thread → Next in month →