[Home] [By Thread] [By Date] [Recent Entries]

  • From: "Andrew Welch" <andrew.j.welch@g...>
  • To: "Philippe Poulard" <philippe.poulard@s...>
  • Date: Wed, 16 Jul 2008 16:55:14 +0100

(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]


Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member