DTD에 따른 FIELDSET & LEGEND 요소 사용법.
안녕하세요? 웹표준화팀 정찬명 입니다.
오늘은 DTD에 따른 FIELDSET과 LEGEND 요소의 다른 사용법에 대하여 공유드리고자 합니다.
- FIELDSET 요소는 하나의 전송양식(FORM)을 의미 단위로 그룹핑하는 요소로서, 회원가입 페이지의 전송양식을 예로 든다면 '필수입력, 선택입력' 등과 같이 의미구조에 따라 전송할 내용을 그룹핑(또는 분할)하는 역할을 하고 있습니다.
- LEGEND 요소는 FIELDSET 요소에 대한 캡션(또는 제목)을 제공하여 양식의 이해를 돕는 역할을 하고 있습니다.
혹시 W3C Markup Validation Service 도구를 사용하면서 FIELDSET 요소 안쪽에 어떤 HTML요소는 허락하지 않는다는 오류를 만나보신 적이 없으신지요?
만난적이 없으시다면 아래 경우 중 한 가지 경우에 해당되실 것 같습니다.
- HTML 4.01(ST) 문서에서 FIELDSET과 LEGEND의 용법을 정확하게 알고 사용하고 있다. (존경합니다^^)
- HTML 4.01(ST) 문서에 대한 Validation Check를 해본적이 없다. (네, 저도 한동안은 뭐..)
- Validation Check는 반드시 진행하지만 주로 XHTML 1.0(ST)을 사용한다. (부럽습니다~)
- FIELDSET 요소를 사용하지 않거나, 평소에 오류따위는 무시하면서 살고 있다. 대수냐. (... 이리오슈~ 냉큼오슈!)
* ST : DTD의 표준모드(Strict) 또는 호환모드(Transitional)를 모두 일컬음.
HTML 4.01 문서에서 FIELDSET 요소를 사용할 때 FIELDSET의 자식으로서 어떤 HTML요소는 허락하지 않는다는 오류를 만나셨다면 그것은 HTML 4.01에서 FIELDSET과 LEGEND를 적절하게 마크업하지 못했기 때문일 수 있습니다. 하지만 그것이 여러분들의 잘못이라고는 생각하지 않습니다. W3C의 HTML 4.01 스펙 명세서에서 이것을 충분히 설명하지 않았기 때문이라고 생각합니다.
결론부터 말씀드리면 FIELDSET과 LEGEND의 사용법은 DTD에 따라 차이가 있습니다.
HTML 4.01의 경우 FIELDSET 사용시 LEGEND 요소는 반드시 첫 번째 자식(first-child)으로 마크업 되어야 합니다.
LEGEND요소를 FIELDSET의 첫 번째 자식으로 마크업 하지 않는 경우 W3C Validator는 LEGEND 속성이 비었다는 경고 대신에 아래와 같은 오류 메시지를 출력합니다.
- 현재의 DTD는 이 자리에 "XXX"요소를 허락하지 않아!
- "FIELDSET"의 닫기 태그가 여기서 나오면 안될껄?
LEGEND요소를 빼먹었다는 언급은 하지 않았지만 두 오류 메시지가 모두 틀린말은 아닙니다. 왜냐하면 LEGEND요소는 FIELDSET의 첫 번째 자식으로 존재해야 하는데 LEGEND가 등장하지 않았음으로 "XXX"라는 요소가 올 자리가 아니라는 사실도 맞고, FIELDSET이 닫히긴 했지만 뭔가 수상하다고 알려주고 있기 때문입니다.
이 사실을 모르셨던 분들의 경우가 더 많다고 생각되는데 그 이유인즉은, HTML 4.01 에서 FIELDSET이 나오면 LEGEND가 첫 번째 자식으로 나와야 한다고 명시적으로 설명하지 않았기 때문입니다. (또, 모르죠 웹 표준 만랩 되시는 분들이 보는 문서에는 기술되어 있는지. 하지만 제가 참조하고 있는 HTML 4.01 명세에는 그런 표현이 없는것 같습니다. 혹시 알고 계시면 알려주세요^^)
XHTML 1.0의 경우 FIELDSET 사용시 LEGEND 요소는 생략해도 됩니다.
제가 참조하는 HTML/XHTML 스펙 명세서에서는 관련 내용을 찾을 수 없었기에 W3C의 공개된 메일링 리스트에서 검색된 질답중 Masayasu Ishikawa 라는 분의 답변을 인용하면 아래와 같습니다. 메일 주소가 xxx@w3.org 형식으로 되어 있기에 급 신뢰가 가서 그분의 답변 일부를 인용합니다.
This is one of several places where XHTML 1.0 cannot approximate the definition of HTML 4.01 due to the difference between SGML and XML. XML doesn't allow the content model like the FIELDSET content model in HTML 4.01, so in order to approximate the definition, XHTML 1.0 had to loosen the content model.
이것은 SGML과 XML간 차이에서 기인하는 것으로 XHTML 1.0을 HTML 4.01과 일치시킬 수 없었던 몇 가지 사례중 하나이다. XML은 HTML 4.01의 FIELDSET과 같은 콘텐츠 모델을 허용하지 않는다. XHTML을 XML의 정의에 일치시키도록 하기 위하여 XHTML 1.0은 FIELDSET 콘텐츠 모델에 대하여 느슨해져야만 했다.
So the semantics hasn't changed, but the XHTML 1.0 DTDs cannot enforce this restriction due to the limitation of XML 1.0. XML Schema could cope with this problem better, though.
의미는 변하지 않았지만 XHTML 1.0은 XML 1.0의 제한 때문에 이것을 강제할 수 없었다. XML 스키마는 이 문제를 좀 더 개선해서 극복해야 한다고 생각한다.
내용을 이해하는게 쉽지는 않았지만 확실한것은 HTML 4.01과 XHTML 1.0의 FIELDSET/LEGEND 문법이 이렇게 다르고 XHTML 1.0에서는 XML과 콘텐츠 모델을 최대한 일치시키기 위하여 LEGEND 요소를 강제하지 않음으로서 오히려 이 콘텐츠 모델에서만큼은 느슨해지게 되었다 라는 사실입니다.
참조 URI
W3C home > Mailing lists > Public > www-html@w3.org > February 2002
Re: FIELDSET, LEGEND, HTML, & XHTML
http://lists.w3.org/Archives/Public/www-html/2002Feb/0054.html
글의 오류나 추가정보에 대한 코멘트를 언제든 환영합니다.
감사합니다. ^