W3C3 SGML과 HTML에 대하여Trio 홈페이지
목차
  1. SGML 소개
  2. HTML에서 사용되는 SGML 구조
    1. 엘레멘트(element)
    2. 애트리뷰트(attribute)
    3. 글자 참조
    4. 코멘트(comment)
  3. HTML DTD 읽는 방법
    1. DTD 코멘트(comment)
    2. 파라메터(parameter) 엔티티(entity) 정의
    3. 엘레멘트(element) 선언
    4. 애트리뷰트(attribute) 선언

이 항목에서는 SGML을 소개하고 HTML과의 관계를 다룬다. SGML 표준의 자세한 내용은 [ISO8879]을 참조하라.

3.1 SGML 소개

SGML은 작성(markup) 언어를 정의하는 체계이다. 제작자는 내용에 구조적 부분, 표현적 부분과 의미있는(semantic) 정보를 적어 넣음으로서 문서들을 작성(markup)한다. HTML은 작성(markup) 언어의 한 종류이다.

HTML 문서의 예제를 보면:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN"
    "http://www.w3.org/TR/REC-html40/strict.dtd">
<HTML>
  <HEAD>
     <TITLE>나의 첫번째 HTML 문서</TITLE>
  </HEAD>
  <BODY>
     <P>안녕하세요 여러분!
  </BODY>
</HTML>

HTML 문서는 머리부분(<HEAD>와 </HEAD> 사이)과 본체부분(<BODY>와 </BODY> 사이)으로 구성되어있다. 문서의 제목은 문서에 관 한 다른 정보들과 함께 머리부분에 있고, 문서의 내용은 본체부분에 있다. 예제에서 본체부분은 <P>로 시작 된 단지 한 문장으로 되어있다.

SGML에서 정의 되어있는 각 작성(markup) 언어를 SGML 적용(application)이라 하는데 일반적으로 다음과 같은 특성을 갖는다.

  1. SGML 선언에서 그 적용에 어떤 글자와 서술이 나타 날 수 있는가를 정의한다.
  2. 문서 타입 정의(DTD: Document Type Definition). DTD는 작성(markup) 언어 구조의 문법을 정의한다. DTD는 글자 엔티티(entity) 참조와 같은 추가적인 정의를 가질 수 있다.
  3. 작성(markup) 언어의 의미을 정의하는 규격이다. 이 규격은 DTD 안에서 사용 될 수 없는 문법적 제한도 포함되어있다.
  4. 문서는 내용과 작성(markup) 부분을 가지며, 각 경우에 DTD 참조와 그 해석 방식을 포함한다.

HTML 4.0 규격은 SGML 선언, 세가지 문서 타입 정의(HTML 버전 정보 참조)와 글자 참조 목록을 포함하고 있다.

3.2 HTML에서 SGML의 구조

다음 항목들은 HTML에서 사용되는 SGML의 구조를 소개한다.

부록의 목록에 HTML 도구와 사용도구에 의해 널리 사용되지 않는 일부 SGML 기능을 소개 하였는데 이들의 사용은 피해야한다.

3.2.1 엘레멘트(element)

SGML의 문서 타입 정의(DTD)는 구조를 설명하거나 필요 한 작동을 정의하는 엘레멘트 타입(element type)를 정의한다. HTML는 문단, 문서 연결(hypertext link), 목록, 표(table), 이미지, 등을 표시하는 엘레멘트 타입들을 갖는다.

엘레멘트 타입의 설명은 일반적으로 세 부분(시작태그, 내용, 종료태그)으로 되어있다.

엘레멘트의 이름에는 시작태그(tag)(<element-name>)와 종료태그(tag) (</element-name>)가 있다. 엘레멘트 이름 앞에 슬래쉬('/': slash)가 있는 것이 종료태그(tag)이다.

번호가 없는 목록 UL 엘레멘트 타입의 시작태그와 종료태그의 예를 들면:

<UL>
<LI><P>...목록 항목 1...
<LI><P>...목록 항목 2...
</UL>

일부 HTML 엘레멘트 타입에서는 제작자가 종료태그를 생략 할 수 있다(예: P, LI 엘레멘트 타입). 일부 엘레멘트 타입에서는 시작태그을 생략 할 수 도 있다(예: HEAD, BODY). HTML DTD는 각 엘레멘트 타입에서 시작태그와 종료태그가 필요한가를 알려 준다.

일부 HTML 엘레멘트 타입은 내용을 갖고 있지 않는다(예: 줄 바꾸는 BR 엘레멘트는 내용 없이 문장의 줄의 종료 기능 만 함). 이와 같은 빈(empty) 엘레멘트는 종료태그를 항상 갖지 않는다. 문서 타입 정의와 이 규격의 설명에서 어떤 엘레멘트 타입이 내용이 없는 빈 것인가, 또는 바른 문법으로 내용을 가질 수 있는 것인가를 알려 준다.

엘레멘트 이름은 항상 대소문자를 구별하지 않는다.

엘레멘트를 제어하는 규칙에 관 한 정보는 SGML 표준을 참조하라. 예를 들어, 시작태그와 종료태그가 적정하게 네스트(nest) 되어야 하고, 종료태그는 짝 맞는 새로운 시작태그를 만나면, 앞의 모든 생략 된 시작태그를 자동으로 닫는다(항목 7.5.1 참조).

예를 들어, 문단 <P>에서:

<P>이는 첫번째 문단이다.</P>
... 블럭(block) 엘레멘트...

다음과 같이 종료태그(</P>)를 생략 할 수 있고:

<P>이는 첫번째 문단이다.
... 블럭(block) 엘레멘트...

이는 시작태그 <P>가 다음 블럭 엘레멘트 시작태그를 만나면 종료 되기 때문이다. 같은 방법으로 아래 예제에서 문단이 블럭 엘레멘트 안에 있으면:

<DIV>
<P>이 것이 그 문단이다.
</DIV>

블럭 엘레멘트의 종료태그 </DIV>는 시작태그 <P>로 열린 문단이 닫긴 것으로 판단한다.

엘레멘트는 태그가 아니다. 어떤 사람들을 엘레멘트를 태그로 해석하는 경우가 있는데(: "P tag") 엘레멘트와 태그(시작태그, 종료태그)는 다른 것임을 명심하라. HEAD 엘레멘트는 문서에 항상 있음에도 불구하고, HEAD의 시작태그와 종료태그는 둘 다 생략 될 수 있다.

모든 엘레멘트 종류들은 이 규격의 엘레멘드 색인 목록에 정리 되어있다.

3.2.2 애트리뷰트(attribute)

엘레멘트(element)는 관련 특성을 가질 수 있는데 이 특성을 애트리뷰트(attribute)라 하며 값을 가질 수 있다. 값은 디폴트(default)로 갖거나, 제작자가 설정하거나 스크립트로(script)로 설정 할 수 있다. 애트리뷰트와 값의 짝은 엘레멘트의 시작태그에서 ">"로 닫기 전에 위치한다. 문법에 맞는 어떤 갯수의 애트리뷰트와 그 값의 짝들은 빈칸(space)으로 분리되고, 그 순서는 관계가 없다.

H1 엘레멘트에 id 애트리뷰트를 설정 한 예제:

<H1 id="section1">
 이 것은 H1 엘레멘트에 id 애트리뷰트를 값이 'section1'이 되게 설정 한 예제이다.
</H1>

디폴트(default)로, SGML은 모든 애트리뷰트(attribute)의 값을 이중 따옴표( ": ASCII 10진수 34) 또는 단일 따옴표( ': ASCII 10진수 39)를 이용하여 구분 된 값으로 요구한다. 이중 따옴표로 구분 된 값의 속에서는 단일 따옴표로 구분 된 값을 포함 할 수 있고, 그 반대 인 단일 따옴표 안에서 이중 따옴표 포함도 가능하다. 제작자는 숫자 참조에서 이중 따옴표(&#34;)와 단일 따옴표(&#39;)를 찾아 쓸 수 있고, 글자 엔티티(entity) 참조에서 &quot;를 찾아 쓸 수도 있다.

경우에 따라 제작자는 애트리뷰트 값을 아무 따옴표 없이 쓸 수 있는데, 이 때의 애트리뷰트 값은 알파벳 글자(a-z 와 A-Z), 숫자(0-9), 하이픈(-: hyphen: ASCII 10진수 45)과 점(.: period: ASCII 10진수 46) 만으로 구성되어 있어야 한다. 그러나 따옴표를 생략 할 수 있는 경우라도 사용하는 것을 추천한다.

애트리뷰트 이름은 항상 대소문자를 구별하지 않는다.

애트리뷰트 값은 일반적으로 대소문자 구별 없이 사용된다. 각 애트리뷰트의 값이 대소문자를 구별하여 하는가는 참고 매뉴얼에 제시 되어있다.

모든 애트리뷰트는 이 규격의 애트리뷰트 색인 목록에 정의 되어있다.

3.2.3 글자 참조

글자 참조는 숫자나 HTML 문서에 포함 될 수 있는 글자 기호의 이름이다. 이들은 자주 사용되지 않는 글자를 조회하거나, 편집기에서 사용하기 힘들거나 사용 할 수 없을 때 유용하게 사용된다. 이 문서 전체를 통하여 글자 참조를 볼 수 있는데 "&" 부호로 시작되고 세미콜론(;)으로 종료된다. 일반적인 예제를 보면:

앞으로 HTML 문서 글자 목록 항목에서 HTML 글자 참조 세부사항을 다룰 것이다. 또한 이 규격에는 HTML 4.0 문서에서 사용되는 글자 참조 목록이 포함 되어있다.

3.2.4 코멘트(comment)

HTML의 코멘트의 문법은 다음과 같다.

<!-- 이 부분은 코멘트이다. -->
<!-- 이 부분은 여러 줄
        코멘트이다. -->

코멘트을 시작하는 "<!"와 내용을 시작하는 "--" 사이에는 공간이 허용되지 않는다. 그러나 내용을 종료하는 "--"와 코멘트을 종료하는 ">" 사이에는 공간이 허용된다. 일반적인 오류는 코멘트 속에 "---"가 포함되어 나타난다. 제작자는 코멘트 내용에서 두개 이상의 하이픈('-')을 연속해서 사용하는 것을 피해야한다.

코멘트에 나타난 정보들은 특정 의미를 갖지 않고, 글자 참조에 의해 해석 되지 않는다.

3.3 HTML DTD 읽는 방법

각 엘레멘트(element)와 애트리뷰트(attribute)는 이 규격의 문서 타입 정의(DTD) 부분을 갖는다. 이 규격에서 찾아보기 쉬운 방식보다는 DTD 부분들을 포함하도록 했는데, 이는 더 길고 덜 정밀한 엘레멘트의 특성을 설명하는 방식이다. 다음 설명(tutorial)은 SGML에 친숙하지 않은 독자가 DTD를 읽어 HTML 규격의 기술적 세부사항을 이해하게 한 것이다.

3.3.1 DTD 코멘트(comment)

DTD에 있어서 코멘트은 한 줄이나 여러 줄이 될 수 있으며 "--"의 짝 사이에 들어 간다.

예를 들어:

<!ELEMENT PARAM - O EMPTY       -- 명명 된 특성 이름의 값 -->

여기에서 코멘트 "명명 된 특성 이름의 값"은 PARAM 엘레멘트 타입의 사용을 설명한다. DTD에서 코멘트은 수행되지 않고 단순 한 정보 만을 제공한다.

3.3.2 파라메터 엔티티 정의

HTML DTD는 파라메터 엔티티 정의로 시작된다. 파라메터(parameter) 엔티티(entity) 정의는, DTD의 다른 부분에서 자세히 찾아 볼 수 있는, 일종의 마크로(macro)이다. 이와 같은 마크로들은 DTD에 만 나타나고, HTML 문서에는 나타나지 않는다. 글자 참조라는 다른 종류의 마크로들은 HTML 문서의 텍스트나 애트리뷰트 값 안에서 사용 될 수 있다.

DTD에서 이름으로 파라메터 엔티티를 참조 할 때, 문자열로 표시된다.

파라메터 엔티티 정의는 <!ENTITY %라는 키워드로 시작되고, 엔티티(entity) 이름이 따옴표 속의 문자열로 기술되며, 끝에 >으로 닫는다. DTD의 파라메터 엔티티들은 "%"로 시작 되고, 파라메터 엔티티 이름, 그리고 선택적인 ";"로 끝난다.

다음 예제는 "%fontstyle;"가 기술된 문자열을 설명한다.

<!ENTITY % fontstyle "TT | I | B | BIG | SMALL">

파라메터 엔티티를 기술하는 문자열에는 다른 파라메터 엔티티 이름들을 가진다. 이들 이름들은 반복적으로 사용된다.

다음 예제에서 "%inline;" 파라메터 엔티티에는 "%fontstyle;", "%phrase;", "%special;"과 "%formctrl;" 파라메터 엔티티들이 포함된다고 정의 한 것이다.

<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">

HTML DTD에서 "%block;""%inline;" 두가지의 파라메터(parameter) 엔티티(entity)들을 자주 볼 수 있다. 이들은 블럭레벨과 인라인 엘레멘트를 포함하는 내용 모델에 사용되며, HTML 문서의 공통 구조에 정의 되어있다.

3.3.3 엘레멘트선언

HTML DTD 모듬는 엘레멘트(element) 타입(type)과 그 애트리뷰트(attribute)로 구성된다. <!ELEMENT로 시작되고>로 종결되며, 그 사이에 아래 내용들이 기술된다.

  1. 엘레멘트 이름.
  2. 엘레멘트의 종료태그는 선택적이다. 엘레멘트 이름 다음에 두개의 하이픈('-'와 '-')이 나오면, 각각은 시작과 끝을 의미하며 필수적이다. 한 개의 하이픈 뒤에 "O"가 있으면, 종료태그가 생략 될 수 있고, "O"가 짝으로 있으면 시작태그와 종료태그가 생략 될 수 있다.
  3. 엘레멘트의 내용이 될수 있다. 가능한 엘레멘트 컨텐트을 컨텐트(content) 모델이라한다. 내용을 갖지 않게 설계 된 엘레멘트 타입을 빈(empty) 엘레멘트라 하며, 컨텐트 모델은 "EMPTY"라는 키워드를 사용하여 정의한다.

예제:

   <!ELEMENT UL - - (LI)+>

빈(empty) 엘레멘트를 정의하는 예제:

   <!ELEMENT IMG - O EMPTY>

컨텐트(content) 모델 정의

컨텐트 모델은 그 엘레멘트 타입에서 어떤 내용들이 포함 될 수 있는가를 표시 한다. 컨텐트 모델 정의에는 다음 사항들이 포함된다.

엘레멘트의 컨텐트 모델은 다음 문법으로 기술한다.

( ... )
구룹을 지정.
A | B
A 또는 B이고, 둘 다는 아님.
A , B
A와 B가 순서를 맞춰 둘 다 나타 남.
A & B
A와 B가 순서는 관계 없이 둘 다 나타 남.
A?
A가 안나타나거나 한 번나타 남.
A*
A가 안나타나거나 한번 이상 나타 남.
A+
A가 한번 이상 나타 남.

HTML DTD의 예제:

  <!ELEMENT UL - - (LI)+>

UL 엘레멘트에는 LI 엘레멘트가 한개 이상 포함 되어야 함.

  <!ELEMENT DL    - - (DT | DD)+>

DL 엘레멘트에는 순서는 관계 없이, 하나 이상의 DT 또는 DD 엘레멘트가 포함 되어야 한다.

  <!ELEMENT OPTION - O (#PCDATA)>

OPTION 엘레멘트는 텍스트와 &amp;와 같은 엔티티(entity) 만을 가질 수 있는데, SGML 데이터 종류는 #PCDATA이다.

HTML의 소수 엘레멘트 타입에서 컨텐트(content) 모델로 부터 어떤 엘레멘트를 제외하기 위하여 추가적인 SGML 기능을 사용한다. 제외 된 엘레멘트들은 하이픈('-') 다음에 표시한다. 제외하면 허용 된 엘레멘트에서도 제외된다.

아래 예제에서 -(A)는 엘레멘트 A 안에서 다른 A 엘레멘트를 가질 수 없음을 나타낸다.

  <!ELEMENT A - - (%inline;)* -(A)>

A 엘레멘트 타입는 DTD 파라메터(parameter) 엔티티(entity) "%inline;"의 부분이지만, -(A)로 제외 되었다.

같은 식으로, 다음 엘레멘트 타입 정의는 FORM에 다른 FORM을 포함하는 것을 금하고 있다.

  <!ELEMENT FORM - - (%block; | SCRIPT)+ -(FORM)>

3.3.4 애트리뷰트(attribute) 선언

키워드 <!ATTLIST로 엘레멘트가 자질 수 있는 애트리뷰트 선언이 시작 되며, 엘레멘트(element) 이름과 애트리뷰트 정의 목록이 나온 다음>로 종료된다. 각 애트리뷰트 정의에서 다음 사항들을 결정한다.

아래 예제에서 MAP 엘레멘트의 선택적인 name 애트리뷰트가 정의 되었다.

<!ATTLIST MAP
 name        CDATA     #IMPLIED
>

이 애트리뷰트에서 허용 된 값의 종류는 SGML 데이터 타입 인 CDATA 이다. CDATA글자 참조를 포함 할 수 있는 텍스트이다.

추가적인 "CDATA", "NAME", "ID"나 기타 데이터 타입의 내용은 HTML 데이터 타입을 참조하라.

다음 예제는 몇 개의 애트리뷰트 정의를 설명한다.

rowspan     NUMBER     1         -- 칸(cell)에 의해 표현되는 줄 수 --
http-equiv  NAME       #IMPLIED  -- HTTP에 반영되는 헤더 이름  --
id          ID         #IMPLIED  -- 전 문서를 통해 유일한 id --
valign      (top | middle | bottom | baseline) #IMPLIED

애트리뷰트 정의에서 DTD 엔티티

애트리뷰트 정의에는 파라메터(parameter) 엔티티(entity) 참조를 포함 할 수 있다.

아래 예제는 "%attrs;"라는 파라메터 엔티티로 시작하는 LINK 엘레멘트의 애트리뷰트 정의 목록이다.

<!ELEMENT LINK - O EMPTY               --  메디아와 관계 없는(독립적인) 연결 -->
<!ATTLIST LINK
 %attrs;                              -- %coreattrs, %i18n, %events --
 charset     %Charset;      #IMPLIED  -- 연결 된 지원의 글자 엔코딩 --
 href        %URI;          #IMPLIED  -- 자원에 연결 시키기 위한 URI --
 hreflang    %LanguageCode; #IMPLIED  -- 언어 코드 --
 type        %ContentType;  #IMPLIED  -- 컨텐트 타입(content type) 정보 --
 rel         %LinkTypes;    #IMPLIED  -- 앞으로하는 연결(link) 타입 --
 rev         %LinkTypes;    #IMPLIED  -- 뒤로하는 연결(link) 타입 --
 media       %MediaDesc;    #IMPLIED  -- 이 메디아를 작동시키기 위하여 --
>

시작태그는 필요하고, 종료태그는 금지

"%attrs;" 파라메터 엔티티는 다음과 같이 정의된다.

<!ENTITY % attrs "%coreattrs; %i18n; %events;"
>

"%attrs;" 안에서 "%coreattrs;" 파라메터 엔티티는 다음과 같이 정의된다.

<!ENTITY % coreattrs
"id          ID             #IMPLIED  -- 문서 전체를 통 한 독특 한 id --
 class       CDATA          #IMPLIED  -- 클라스(classe) 목록은 빈칸으로 분리된다 --
 style       %stylesheet;   #IMPLIED  -- 연관 된 스타일 정보 --
 title       %Text;         #IMPLIED  -- 참고 제목/배율(amplification) --"	
>

이 애트리뷰트들은 대부분의 HTML 엔트리 타입에서 정의 되었으므로 "%attrs;" 파라메터 엔티티는 편이성을 위하여 정의하였다.

비슷하게, DTD에서 "%URI;" 파라메터 엔티티를 문자열 "CDATA"로 정의 하였다.

<!ENTITY % URI "CDATA" --  URI(Uniform Resource Identifier) --
>

이 예제에서 설명 된 바와 같이 DTD를 읽을 때 "%URI;" 파라메터 엔티티는 애트리뷰트가 기대하는 데이터 타입에 대 한 보다 상세한 정보를 제공한다. "%Color;", "%Charset;", "%Length;", "%Pixels;"등의 엔티티들에 대해서도 비슷한 정의들이 되어있다.

불린(boolean) 애트리뷰트(attribute)

일부 애트리뷰트는 불린 변수의 기능을 한다(예: SELECT 엘레멘트에서 selected 애트리뷰트). 엘레멘트의 시작태그에 이 애트리뷰트를 만나면 값이 '맞다'(true)이고, 만나지 않으면 값이 '틀린다'(false)가 됨을 의미한다.

불린 애트리뷰트는 문법이 틀리지 않고 값을 가질 수 있는데, 예를 들면 selected="selected"와 같이 애트리뷰트 자체의 이름을 값으로 가질 수 있다.

아래 예제에서는 selected 애트리뷰트가 불린 애트리뷰트가 되도록 정의 하였다.

selected     (selected)  #IMPLIED  -- 내부 항목이 없음 --

애트리뷰트가 엘레멘트의 시작태그 안에 있으면 "true"로 설정하는:

<SELECT selected="selected">
 ... 내용 ...
<SELECT>

HTML에서 불린(boolean) 애트리뷰트는 엘레멘트의 시작태그에 단독으로 을 갖게 간단히 표현 할 수 있다. 이를 위해 selected를 아래와 같이 사용 할 수 있다.

<SELECT selected="selected">
 위의 엘레멘트에서 애트리뷰트를 쓰는 대신
<SELECT selected>

제작자는 많은 사용도구에서 불린 애트리뷰트를 다 인식하지 못하고, 일부 만을 인식한다는 점을 알아야 한다.


Trio 홈페이지 문서(http://trio.co.kr/webrefer/html40/intro/sgmltut.html)는 자유로이 연결 사용이 가능함.