Subject: Re: [xsl] Entities in XML Schemas [OT?] From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx> Date: Mon, 13 Oct 2003 14:52:27 +0100 |
Hi Ragulf, > I do not know if this is off topic for this list. If that is the > case, then please direct me to the right place. This is off-topic because it doesn't have anything to do with XSLT. The best place for your question is xmlschema-dev@xxxxxxx But I'll mention XSLT 2.0 below in order to bring it on-topic while still answering your question ;) > Having an XML document somewhat like: > > <doc> > <text>This is <Bold/>bold</Bold> text</text> > <text>Look at comment<Comment>Beware!</Comment> to be sure you have > understood everything</text> > <text><Bold><Italic>Both bold and italic text</Italic></Bold></text> > </doc> > > in DTD I would have something like: > > <!-- snip --> > <!ENTITY % Inline "Bold|Italic|Uline|Comment;"> > <!ELEMENT text (#PCDATA|%Inline;)*> > <!ELEMENT Bold (#PCDATA|%Inline;)*> > <!ELEMENT Italic (#PCDATA|%Inline;)*> > <!-- Snip --> > > The entity contains numerous other types than those shown. > > Now I at trying to convert to XML Schema, but I don't know how to do > entities like this in schema. > I have Eric van der Vlist's XML Schema book, but have found no examples of > this kind. This is a classic example of where you should use "element substitution groups" in XML Schema. See Page 197 on in Eric's book. First, declare an abstract element called, for example, "_Inline", of a common type called, for example, Inline: <xs:element name="_Inline" type="Inline" abstract="true" /> and then say that the other elements that you want to allow inline are members of that substitution group: <xs:element name="Bold" substitutionGroup="_Inline" /> <xs:element name="Italic" substitutionGroup="_Inline" /> <xs:element name="Comment" substitutionGroup="_Inline" /> This says that wherever a content model allow the <_Inline> element, you can instead provide a <Bold>, <Italic> or <Comment> element. And that the content of the <Bold>, <Italic> and <Comment> elements is specified by the "Inline" type (they inherit it from the head of their substitution group). The Inline type should allow mixed content, with any number of <_Inline> elements: <xs:complexType name="Inline" mixed="true"> <xs:sequence> <xs:element ref="_Inline" minOccurs="0" maxOccurs="unbounded" /> </xs:sequence> </xs:complexType> and the <text> element should be declared with this type as well: <xs:element name="text" type="Inline" /> The <text> element shouldn't be part of the _Inline substitution group because it's not allowed inline. In XSLT 2.0, with a schema-aware processor, you can then write node tests that match any element that's a member of the _Inline substitution group. For example, to have a template that does the same thing with all members of the _Inline substitution group, you can do, for example: <xsl:template match="element(_Inline)"> <span class="{local-name(.)}"> <xsl:apply-templates /> </span> </xsl:template> Cheers, Jeni --- Jeni Tennison http://www.jenitennison.com/ XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Entities in XML Schemas [OT?], Ragulf Pickaxe | Thread | [xsl] Re: Adding hierarchy, Jim_Albright |
XSLT 2.0 Typing (Was: RE: [xsl] Re:, Dimitre Novatchev | Date | [xsl] generation of flat file from , Challa, Harsha |
Month |