These error explanations were originally written by Scott Bigham, they are used here with his permission.
Unterminated comment. The position indicator points to the very end of
the file, where the problem was detected; to find the beginning of the
comment, try searching for the last occurrence of
`<!--
' in the document.
Unterminated comments again. This time, you have a case like:
<!-- This is the first unterminated comment > <!-- This is the second one >
The Validator (correctly) interprets the `--
' in the
second comment as terminating the first comment, and then interprets
the text of the second comment as text between comments, which is not
allowed.
Most likely an invalid comment of the form <!invalid
comment>
; The Validator is (correctly) attempting to
interpret it as an SGML markup
declaration.
You have an attribute whose value needs to be in quotes. If an attribute value contains any character other than letters, digits, hyphens and periods, it must be enclosed in double quotes (single quotes would also be okay from an SGML standpoint, but some browsers don't recognize them).
The Validator has found a character inside an HTML tag that isn't allowed there. This usually means you didn't put an attribute value in quotes when necessary. It also probably means that the character in question is not allowed in the value of the attribute at all, or you would have received the previous error instead. See below for more information.
You can also get in trouble by forgetting the closing quote on an attribute. For instance:
<IMG SRC="http://foo.com/fred.gif> <IMG SRC="http://foo.com/joe.gif>
The Validator will (correctly) interpret this as a SRC value of
"http://foo.com/fred.gif> <IMG SRC="
, and then
choke on the following `:'. In this case, the position indicator in
the error message may be several lines below the line with the missing
quote.
This usually occurs in conjunction with the previous error. It almost always means that you've forgotten a closing quote on an attribute value. For instance, in:
<IMG SRC="fred.gif> <!-- 50 lines of stuff --> <IMG SRC="joe.gif">
The SRC value for the first <IMG>
is the entire
fifty lines of stuff up to the next double quote, which probably
exceeds the SGML-defined length limit for
HTML string literals. Note that the position indicator in the error
message points to where the attribute value ended — in
this case, the "joe.gif"
line.
You've used an unknown tag (represented here by FOO). Make sure the DTD indicated by your DOCTYPE actually includes this element.
If the tag in question is a frame-related tag you must use the "Frameset" DTD, and if you use (deprecated) physical markup ("FONT" and friends) you must use the "Transitional" DTD.
Straightforward, but not terribly informative. There are a lot of different errors that will generate this error message:
<TABLE><TD>blah</TABLE>
will cause
this error. The trick here is that <TABLE>
cannot
directly contain <TD>
's; it contains
<TR>
's which contain <TD>
's.
The above example should be
<TABLE><TR><TD>blah</TABLE>
.
Similar to the previous error, but more specific: in this case, you have a FOO element that is not contained in a BAR element when FOO is not allowed outside of BAR. Some of the most common causes of this error are:
DD
element as a fake paragraph indent.
DD
is not allowed outside of a DL
element.
<OL> <LI>Obtain the following items: <UL> <LI>Ham</LI> <LI>Bread; one of: <UL> <LI>White</LI> <LI>Rye</LI> <LI>Whole wheat</LI> </UL> </LI> <!-- End of the "Bread" <LI> --> <LI>Cheese</LI> </UL> </LI> <!-- End of the "Obtain" <LI> --> <LI>Place ham and cheese between two slices of bread</LI> <LI>Consume the resulting ham-and-cheese sandwich</LI> </OL>
The </LI>
end tags are optional and are only
included above to emphasize how the structure of the nested list
is arranged; if you omit them, the parser will infer their
presence in the locations shown above.
The Validator has inserted a BAR start tag where it thinks there needs to be one; it will probably complain later on that the corresponding end tag is also missing.
You have used an attribute with an element that is defined not to have that attribute. This is most commonly caused by using vendor-specific attributes without setting the document type appropriately.
Similar to the previous error; this time,
you're using an attribute that is defined for the element, but with a
value that isn't defined for the attribute. For instance, the Netscape
extension <IMG ALIGN=ABSMIDDLE>
will cause this
error; ABSMIDDLE isn't one of the allowed values for the ALIGN
attribute of <IMG>
(unless, of course, you provided
a Netscape document type).
If you're using the Netscape document type, the BORDER attribute of
<TABLE>
can cause this error.
This error can also be caused, oddly enough, by missing close quotes on attribute values. For instance, given:
<IMG SRC="fred.gif> <IMG SRC="joe.gif>
The Validator will (correctly) see a SRC attribute of
"fred.gif> <IMG SRC="
, and then try to interpret
JOE.GIF as an attribute of <IMG>
.
Yet another attribute error; this time, the attribute in question was defined to take a numeric value, or an SGML identifier value, and you used a character that doesn't match what it was expecting.
One potentially annoying source of this error is the TD
WIDTH
attribute. Whether intentionally or by oversight, the
HTML 3.2 DTD defines this attribute to have a value type of NUMBER,
which means that <TD WIDTH="50%">
is not allowed.
A special case of the previous error; the attribute in question is defined to take as value an SGML name token, which must begin with a letter.
Another attribute error, this time referring to an "abbreviated"
attribute. SGML allows you to omit the
name of an attribute if the attribute value is unambiguous. For
instance, <IMG ISMAP>
is actually an abbreviation
of <IMG ISMAP=ISMAP>
. (Technically, this also means
that e.g. <P ALIGN=CENTER>
could be abbreviated to
<P CENTER>
, but it is unlikely that current
browsers will get this right.) The Validator has found something that
looks like an abbreviated attribute but doesn't match the value of any
attribute for this element. For instance, a typo like <IMG
ISNAP>
would produce this error.
A missing close quote on a previous attribute value can also trigger
this error if the next quote it finds is followed by something that
looks like an abbreviated attribute; for instance, <IMG
SRC="fred.gif><IMG SRC="joe.gif>
would produce this
error, referring to the "attribute value" JOE.GIF
.
You left off a required attribute of the indicated element. The most
common such omitted attribute is the ALT
attribute of the
AREA
or IMG
element; browsers will typically
use these to build a menu equivalent to your client-side imagemap if
the user has disabled image loading, so you'll want to use a
meaningful value here.
You forgot to close something. FOO is the element you forgot to close (and the next message, `start tag was here' points to the particular instance of FOO in question); the positional indicator points to where The Validator expected you to close the element. There are a few common ways that this can happen:
<UL><LI><H4>fake font
change</H4></UL>
will cause this error, since
headers aren't allowed inside <UL>
's; The
Validator assumes that you meant to close the
<UL>
before opening the <H4>
.
<B><I>nope</B></I>
will cause
this error. HTML requires that you close elements ``inside-out'' ---
that is, the last element you opened is the first element you should
close. In this example, you'd have to close the
<I>
before the <B>
.
<A>
tags. Yes, even <A
NAME="foo">
has to have a corresponding
</A>
. Note that an empty <A
NAME>
element won't be recognized by some browsers; be
sure to put at least a word or two inside the
<A>
.
<DL>fake
indent</DL>
will produce this error, since inside a
<DL>
, The Validator only expects to see
<DT>
's and <DD>
's.
<TABLE WIDTH=100%>
. The
previous error should have been that the `%' was "not allowed in attribute specification list".
What's happening here is that, in trying to get past the `%', The
Validator has become confused and thinks the `%' is inside
the <TABLE>...</TABLE>
, thus triggering the
error message for the previous reason. This error will likely be
followed by mistaken complaints that your <TR>
's
are "not allowed here", plus a complaint
about your </TABLE>
end tag. The solution is to
put the attribute value in quotes; ie. <TABLE
WIDTH="100%">
.
In general, you should always explicitly close all elements and quote all attribute values.
The Validator found an end tag, represented here by FOO, without a
corresponding start tag. This frequently occurs in conjunction with
the previous error. For instance, given
<B><I>nope</B></I>
, The Validator
will insert a </I>
before the
</B>
, and then will find the
</I>
after the </B>
and will
have nothing to match it with.
A subtle variation of this is <P><H4>fake font
change</H4></P>
. <H4>
's aren't
allowed inside <P>
's, but since HTML allows you to
omit the </P>
end tag for paragraphs, The Validator
assumes that you meant <P></P><H4>fake font
change</H4></P>
, in which case the final
</P>
is indeed superfluous.
This error can also be caused by incorrectly supplying an end tag for
"empty" elements like <HR>
, <BR>
or <IMG>
.
You have a FOO element, but you have omitted some required sub-element
of it. For instance, a TABLE
with no TR
's
would cause this error.
The Validator expected you to start a FOO element at the indicated
point. This probably means you've put unadorned text somewhere it
isn't allowed; for instance, <UL>fake
indent</UL>
will cause this error.
The Validator has found an entity (something like
&this;
) that it doesn't recognize. There are a few
possibilities:
"
in conjunction with the HTML 3.2
DOCTYPE
. This entity was accidentally
omitted from the most recent version of the HTML 3.2 DTD. You
should be able to ignore this error safely, though if you wish, you
can replace "
with the equivalent character
entity "
.
in conjunction with the Mozilla
DOCTYPE
. WebTechs' Mozilla DTD, which The Validator
uses, inexplicably does not define this entity. This error message
should not cause a problem, though you may wish to switch to the
equivalent but more widely handled character entity
 
.
this&that
for "this&that", which The Validator (correctly) interprets as a
request for the entity &that;
. Technically, any
non-alphanumeric character (such as a space) will suffice to
terminate the entity, but some browsers get this wrong; the safest
thing to do is to terminate all entities with a semicolon, turning
our example into this&that
.
A URL for a CGI program that uses `&' as a separator, such as
"http://host/prog?x=1&y=2
". This is a common
problem: the inventors of CGI didn't think things through very
carefully when they decided to use the '&' character as a
separator between CGI arguments, because '&' has special
status in HTML. One way to get around this is for the author
of the CGI program to use a different value between arguments,
like ';' or '|', which would allow the link to be coded as
<img src="http://site/cgi?opt1=val1;opt2=val2">
or whatever.
Please contact the maintainer of the CGI program you are linking to, and ask them to use a different character for their separator. (Normally this is extremely easy to add to the CGI program; multiple characters can also be used so existing links using the '&' character will still work.)
There is also a simple workaround described at <URL:http://www.htmlhelp.com/tools/validator/problems.html#amp>. Simply encode all your &'s as & in attribute values.
You've used an illegal character in your text. HTML uses the standard ISO8859-1 character encoding, and ISO8859-1 leaves undefined 65 character codes (0 to 31 inclusive and 127 to 159 inclusive); The Validator has found one of these undefined characters in your document. The character may appear on your browser as a curly quote, or a trademark symbol, or some other fancy glyph; on a different computer, however, it will likely appear as a completely different character, or nothing at all.
Your best bet is to replace the character with the nearest equivalent ASCII character, or to use an appropriate character entity. For more information on ISO8859-1, see Alan Flavell's excellent ISO8859-1/HTML reference.
This error can also be triggered by formatting characters embedded in documents by some word processors. If you use a word processor to edit your HTML documents, be sure to use the "Save as ASCII" or similar command to save the document without formatting information.
You'll get several occurrences of this error if you use the Cougar
DTD. Cougar uses the 16-bit UCS-4 (a.k.a. "Unicode") character set
instead of the 8-bit ISO8859-1 character set used by HTML 2.0 and HTML
3.2. It also defines mnemonic entities for various Unicode characters;
for instance, the entity ™
is defined as the
character entity ™
, which is the Unicode
trademark character. Unfortunately, the nsgmls
executable
used by The Validator does not appear to have 16-bit character support
compiled in, and so it chokes on these 16-bit character entities.
These errors are not produced by anything in your document and should not otherwise affect the validation of your document, so you can pretty much ignore them.
Your DOCTYPE
declaration contains a public identifier
that The Validator doesn't recognize. See the discussion of DOCTYPE
for an
explanation of what's happening, and what public identifiers The
Validator recognizes.
Note that all of the rest of the errors you received are meaningless; The Validator was unable to find a DTD to work from, and thus could not validate your document.
The element "FOO" is defined to require one or more sub-elements. One example is TR which requires one or more TD or TH elements.
Not an error, but rather a pointer to the start tag of the element the previous error referred to.