[whatwg] Citing multiple <blockquote> elements in HTML5

Calogero Alex Baldacchino alex.baldacchino at email.it
Tue Dec 2 21:48:34 PST 2008

Benjamin Hawkes-Lewis ha scritto:
> Calogero Alex Baldacchino wrote:
>> [...]
> I think you're confusing parsing rules that conforming user agents 
> must follow to associate identifiers with elements (even when ids are 
> duplicated) with the authoring rules that conforming documents must 
> follow (ids must be unique).

Ok, so what's what?

When you read "The value must not contain any space characters.", is it 
an authoring rule for conforming documents, for you? Ok.

When you read "*If the value is not the empty string, user agents must 
associate the element with the given value (exactly, including any space 
characters)* for the purposes of ID matching within the subtree the 
element finds itself (e.g. for selectors in CSS or for the 
|getElementById()| method in the DOM).", is it a parsing rule for 
conforming user agents, for you? Ok. But, isn't it worth to spend a word 
everywhere in the spec to tell when it's a quirck for backward 
compatibility, which might go away in the future, and when it's not, 
because that's not needed? And when it's a drawback from the past, 
shouldn't it be considered in every aspect? After all, wasn't one of the 
main goals of html 5 to turn unwritten and browser-specific rules into 
written and standard behaviours?

I mean, if you allow spacing characters inside an id value, as a parsing 
rule, you can face something like '<div id="foo bar" >', that is an id 
consisting of more than one token. Is it good to leave it in untouched? 
Yes? Ok, but what does it mean for CSS's, since there is a reference to 
them as one reason to allow space characters? That is, can a browser 
handle an id selector starting with the '#' character and being broken 
by a blank space? Or better, is it legal in CSS? Honestly, again, I 
don't remember well, I've never tried something like that (since makes 
no sense at me), and I think that's illegal. But let's say that's 
illegal for conforming style sheets, but existing user agents may or may 
not allow that, each one with its own behaviour. If we "close one eye" 
for '<div id="foo bar" >' in a piece of HTML 5 code, but leave its CSS 
counterpart to a free implementation, we'll solve half of the problem 
(where the problem is turning unwritten rules to written, and possibly 
improved, standards), won't we? But any kind of "CSS quirks" would be 
out of an HTML specification, and I believe '<div id="foo bar" >' is a 
trouble (if instead "foo bar" is not a valid id selector for CSS in any 
browser, that means we're allowing user agents to parse as valid an id 
which is inconsistent with CSS, and so CSS selectors cannot be a reason 
to allow space characters inside an id string - at least, with respect 
to any direct reference to the identifier value). But it might be a 
trouble per se, even only for html conformance by user agents, since an 
URL fragment might contain escaped space characters, but an escaped 
space isn't the same thing as the space character itself, so the rule of 
exact matching, applied to space characters inside an id, may be a 
trouble without extensively considering the '<div id="foo bar" >' case.

Now, let's say, instead, that a user agent, conforming with HTML 5 
specifications, must cut off any token after the first one (I know 
actually "foo bar" is taken as is), that is <div id="foo bar"> becomes 
<div id="foo "> and <div id=" foo "> is valid too. In such a case, 
skipping any spaces too, and stating the same behaviour for strings 
passed to .getElementById() could be nice as a graceful degradation for 
documents non-conforming with the rule "the value [of an id attribute] 
must not contain any space characters", but such might fail with CSS 
selectors such as 'div[id="foo bar"]'.

Perhaps a compromise, if acceptable for backward compatibility, might be:
- when the id value must be compared to a fragment identifier, strip any 
trailing space characters; if the match fails, escape any other space 
characters both in the id value and in the fragid and try again;
- when an attribute is defined to hold an url and its value has spaces 
in its path/query/fragment, escape them before resolving the url (not 
sure if needed);
- for the purpose of ID matching through the DOM 'getElementById' 
method, leave the id value untouched;
- for the purpose of ID matching through CSS selectors accessing it as 
an attribute, leave the id value untouched;
- for the purpose of ID matching through CSS selectors directly 
accessing it (e.g. '#foo') either choose the first sequence of 
non-spacing characters or let the match fail (I can't decide what's 
better, but perhaps the former would fail as well, since I guess anyone 
coding <div id="foo bar"> not only as a fragment identifier, but also 
for styling, might have the nice idea to write "#foo bar { font-weight : 
bold; }" as well).

Anyway, if the id value is also a fragment identifier, which might have 
space characters (since parsing rules prescribe to add such characters 
to the unreserved production), does the (authoring) rule "the value must 
not contain any space characters" make sense?

Now let's come to the duplicated ids issue. Again, what's what? When 
it's said, "The id attribute represents its element's unique identifier. 
*The value must be unique in the subtree within which the element finds 
itself and must contain at least one character.*", I think that's what 
you call an authoring rule. So, I don't think it was so bad to ask for a 
clarification on the subtree nature. And if a subtree happened to match, 
eventually, an element subtree inside a document, was the suggestion for 
a getElementById method on the HTMLElement interface so awful? 
Otherwise, let's consider (again) the second paragraph:

"If the value is not the empty string, user agents must associate the 
element with the given value (exactly, including any space characters) 
*for the purposes of ID matching within the subtree the element finds 
itself (e.g. for selectors in CSS or for the |getElementById()| method 
in the DOM).*"

It's a parsing rule, isn't it? But it tells also the id must be unique 
in the whole document for the purpose of ID matching through the 
getElementById() method in the DOM, because the only object capable to 
get an element by its id is an instance of the Document interface. So, 
any choice should be taken on what to do with duplicated ids. Solving 
the question at the parser level (i.e. defaulting any duplicated id to 
the empty string) would be consistent with both the fragment identifier 
behaviour (only the first occurrence is valid) and the uniqueness rule, 
but might brake some semantics (i.e. an hyperlink used to create an 
instance of a <dfn>, or a <blockquote> with a cite attribute referencing 
a <cite> element, both with a duplicated id not being the first 
occurrence). On the other hand, leaving the duplicated id in the 
document requires some changes in the Document's getElementById() 
method, since the W3C DOM Core does not define a unique behaviour in 
such a case, and I've expressed a few dubts on solving this by adding an 
equivalent method on the HTMLDocument interface; anyway the 
getElementById() behaviour must be defined for such situations, and 
having it to pick the first match may be a solution (but might cause 
side/unwanted effects if misused in actual documents, and leaves no 
chance to access directly to any element with a duplicated id, but if 
I'm not careful when choosing an ID, I can complain just with myself... 
- anyway, the uniqueness fulfillment might become problematic when 
dinamically putting together pieces of code, perhaps from different 
sources, e.g. using XMLHTTPRequests, or because of externally syndicated 
contet, but this is in the scope of careful programming).

 From the point of view of CSS, both choices may be consistent with 
coupled rules such as "#foo { font-size : 13; }" and #foo { font-size : 
14; }", since both would refer to the same element because of cascading 
rules; on the other side, something like 'div[id="foo"] {/*something 
here*/}' or a direct reference to an ID selector as a descendant of 
different elements might perhaps isolate different elements in the 
document (whether to allow such or not is outside html scope - but are 
such cases in the wild?), and for the purpose of compatibility with 
document styled that way, leaving duplicated ids in the document would 
be a better choice. But, in such cases, shouldn't the DOM elements 
selection be consistent with the CSS elements selection (i.e. to avoid 
side-effects when CSS rules manipulate the DOM itself)? That is, if 
through CSS it were possible to reach elements with duplicated ids in 
different subtrees of a document tree (according to the definition of 
all nodes descendant of a non-leaf node as being part of its subtree) 
and to manipulate their content, shouldn't it be possible through the 
DOM too?

Anyway, I'm not so much confused, no more than usual :-P

BR, Alex.
 Caselle da 1GB, trasmetti allegati fino a 3GB e in piu' IMAP, POP3 e SMTP autenticato? GRATIS solo con Email.it http://www.email.it/f
 CheBanca! La prima banca che ti dà gli interessi in anticipo.
* Fino al 4,70% sul Conto Deposito, zero spese e interessi subito. Aprilo!
 Clicca qui: http://adv.email.it/cgi-bin/foclick.cgi?mid=7917&d=3-12

More information about the whatwg mailing list