- From: Joe English <joe@trystero.art.com>
- Date: Tue, 05 Nov 1996 08:53:45 PST
- To: www-html@w3.org
Peter Flynn <pflynn@curia.ucc.ie> wrote:
> <!ELEMENT HEAD - O (TITLE & ISINDEX? & BASE? & META* & LINK* & NEXTID? &
> BGSOUND? & SCRIPT? & NOSCRIPT? & STYLE? & RANGE*)
> --<Title>Documentation header-->
>
> This defines exactly one TITLE plus optional everything else: ? means
> zero or one of them; * means zero or more of them. I think that's
> right, shouldn't be any need for a hack.
This content model prohibits intermingled METAs and LINKs
(<META><LINK> <META><LINK>...) -- the AND group requires that
all the META elements appear together, all the LINK elements
appear together, etc.
There are a number of conventions for metadata in HTML
(such as the Dublin Core scheme) that use intermingled
METAs and LINKs, so this is a fairly important issue.
The best solution I was able to come up with was:
<!ENTITY % head.any -- repeatable HEAD elements --
"(META | LINK | SCRIPT | STYLE | RANGE)*" >
<!ELEMENT HEAD - -
( %head.any; ,
( (TITLE, %head.any;)
& (BASE, %head.any;) ?
& (ISINDEX, %head.any;) ?
& (NEXTID, %head.any;) ?
& (BGSOUND, %head.any;) ? ) ) >
(This might be a bitch to specify using Near&Far though :-)
Another solution, which is what Dave Raggett used for
HTML 3.2, is to make the "%head.any;" elements an
inclusion exception on the HEAD element and an
exclusion exception on TITLE, SCRIPT, and other
non-empty subelements:
<!ENTITY % head.any -- same as above but no '*' --
"(META | LINK | SCRIPT | STYLE | RANGE)" >
<!ELEMENT HEAD - O (TITLE & BASE & ...) +%head.any; >
<!ELEMENT TITLE - - (#PCDATA) -%head.any; >
<!-- etc. -->
The exclusions are important; otherwise you can have
<HEAD>
<TITLE>blah <SCRIPT>...</SCRIPT> blah </TITLE>
</HEAD>
--Joe English
joe@art.com
Received on Tuesday, 5 November 1996 11:57:04 UTC