XML.orgXML.org
FOCUS AREAS |XML-DEV |XML.org DAILY NEWSLINK |REGISTRY |RESOURCES |ABOUT
OASIS Mailing List ArchivesView the OASIS mailing list archive below
or browse/search using MarkMail.

 


Help: OASIS Mailing Lists Help | MarkMail Help

[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index]
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/


[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index]


News | XML in Industry | Calendar | XML Registry
Marketplace | Resources | MyXML.org | Sponsors | Privacy Statement

Copyright 1993-2007 XML.org. This site is hosted by OASIS