Take for instance this XHTML snippet:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>A webpage</title>
</head>
<body>
<p>
<form action="something.php" method="get">
<input type="submit" value="Hello"/>
</form>
</p>
</body>
</html>
The tree should be valid, however this won't parse correctly in a browser.
Look at the error messages that you get when you try that with http://validator.w3.org
Apart from a warning that you haven't specified a character encoding (and that it's therefore assuming UTF-8), the main error is that a <p>
isn't allowed to contain non-inline content. You can either remove the <p>
and </p>
completely, or, move them inside the <form>
.
As for 'why', it's because that's how it's defined in the schema which defines what is and what is not valid XHTML. If you look at this section of the XHTML definition you'll see that <p>
is only allowed to contain text or 'inline' (not 'block') tags. However a <form>
counts as 'block' content not as 'inline' content.
In other words, a form can contain paragraphs, but a paragraph cannot contain forms.
According to this, because:
Line 8, Column 44: document type does
not allow element "form" here; missing
one of "object", "ins", "del", "map"
start-tag ✉
The mentioned element is not allowed
to appear in the context in which
you've placed it; the other mentioned
elements are the only ones that are
both allowed there and can contain the
element mentioned. This might mean
that you need a containing element, or
possibly that you've forgotten to
close a previous element.
One possible cause for this message is
that you have attempted to put a
block-level element (such as "p" or
"table") inside an inline element
(such as "a", "span", or
"font").
Line 9, Column 40: document type does
not allow element "input" here;
missing one of "p", "h1", "h2", "h3",
"h4", "h5", "h6", "div", "pre",
"address", "fieldset", "ins", "del"
start-tag
input type="submit" value="Hello" The mentioned
element is not allowed to appear in
the context in which you've placed it;
the other mentioned elements are the
only ones that are both allowed there
and can contain the element mentioned.
This might mean that you need a
containing element, or possibly that
you've forgotten to close a previous
element.
One possible cause for this message is
that you have attempted to put a
block-level element (such as "p" or
"table") inside an inline element
(such as "a", "span", or
"font").
You can't put form inside paragraph. Write like this:
<body>
<form action="something.php" method="get">
<p>
<input type="submit" value="Hello"/>
</p>
</form>
</body>
Try using the W3C Markup Validator, which will tell your what is invalid with most (X)HTML and CSS documents.
I ran a test with your HTML code through validator.w3.org and the result is that you need to swap the P and FORM tags for it to pass as valid W3C HTML.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>A webpage</title>
</head>
<body>
<form action="something.php" method="get">
<p>
<input type="submit" value="Hello"/>
</p>
</form>
</body>
</html>