▣ 제스츄어 릴레이

준비물 - 속담이나 노래제목이 적혀있는 카드 5장
- 1팀씩 앞으로 나오게 하여 종대로 서게 한다. 리더는 속담이 써있는 카드를 맨앞에 서있는 사람에게만 보여주고 이것을 본 첫주자는 입으로는 말하지 않고 몸과 표정으로만 제스츄어를 하여 뒤로 전달한다.
- 이와같이 계속하여 맨마지막 사람은 이 제스츄어가 뜻하는 속담을 리더와 전체 참가자들에게 큰소리로 말한다.

* 예) 낫놓고 기억자도 모른다.
까마귀 날자 배떨어진다.
지렁이도 밟으면 꿈틀거린다.
바늘도둑이 소도둑된다.

'레크레이션 > 팀대항 게임' 카테고리의 다른 글

▣ 개미떼 풍선터트리기  (0) 2007.12.02
▣ 촛불들고 달리기  (0) 2007.12.02
▣ 지구는 초만원  (0) 2007.12.02
▣ 우리팀의 I Q  (0) 2007.12.02
▣ 텔레파시  (0) 2007.12.02
▣ 지구는 초만원

준비물 - 신문지 10장
- 바닥에 깔아놓은 신문지위에 각 팀들이 서야 되는 것으로 필히 신문지 안에 팀 전체가 들어가야 한다.
- 계속 접으며 서야 하는데 가장 작게 접은 신문지위에 서있는 팀이 승리하게 된다. 이때 발이 나가면 탈락이고 서로 업어주는 것은 상관없다

'레크레이션 > 팀대항 게임' 카테고리의 다른 글

▣ 개미떼 풍선터트리기  (0) 2007.12.02
▣ 촛불들고 달리기  (0) 2007.12.02
▣ 제스츄어 릴레이  (0) 2007.12.02
▣ 우리팀의 I Q  (0) 2007.12.02
▣ 텔레파시  (0) 2007.12.02
▣ 우리팀의 I Q

준비물 - 긴 작문이나 노래가사 카드, 볼펜 5자루, 종이 5장
- 각 팀별로 종대로 길게 서게 한 후 각 팀 5명의 대표주자를 15미터 정도 목표물이 있는 앞으로 나오게 한다. 리더는 미리 작성해 놓은 긴 작문 의 카드를 보여 주고 이것을 1분동안 외우라고 한다.
- 1분이 지나면 리더는 이 작문카드를 주머니에 넣는다. 그리고 각 대표주자끼리 간격을 3미터정도 거리를 두고 서있게 한다. 이어서 그다음 주자들이 리더의 구령소리에 따라 각 팀 대표주자들에게 달려가 그 작문의 내용을 구두로만 전송 받는다.
- 이때 대표주자들의 전송이 끝나면 다른 한곳에 모이도록 한다.
- 이러한 방식으로 계속 한사람씩 나와서 릴레이 하는데 이렇게 하여 제일 마지막 주자는 리더가 준비해둔 볼펜과 종이를 받아 앞주자로부터 전송받은 긴 작문을 기억하여 종이에 써 내려간다.
- 리더는 이것을 다 수거하여 다시 다 모인 자리에서 먼저 원래의 긴 작문을 읽어 주고 나서 이어서 각 팀별로 전송한 작문을 읽어 본다.
- 그런데 각 팀의 전송된 작문이 앞뒤의 내용이 맞지않고 상이하게 되어 있어 참가자들이 폭소를 터트리고 만다.
              
* 메시지 예문 *

내발산동 78번지에 사는 진떡배씨는 밥을 많이  먹기로 유명하고 구파발 34번지에 사는 나떡순씨는 잠을  많이 자는 것으로 동네에 소문이 자자했다.
이 두사람은 우연히 왕심리 뒷산을 산책하다 눈이 맞아 이것이 운명의 만남으로 이어져 1991년 5월 4일에 결혼을 하게 되었다. 그런데 결혼은 했지만 부부는 밥과 잠만 좋아하고 사랑은 없었다.
어느덧 20년이 흘러 이들 부부는 체중이 늘었는데 남편은 112kg, 허리 59인치이고 부인은 78kg, 허리  43인치나 되었다.

- 노래가사로 대신할 수 있다.      
- 리더는 숫자의 정확함과 문맥의 뜻이 연결되는지를 확인하여 점수를 준다.

'레크레이션 > 팀대항 게임' 카테고리의 다른 글

▣ 개미떼 풍선터트리기  (0) 2007.12.02
▣ 촛불들고 달리기  (0) 2007.12.02
▣ 제스츄어 릴레이  (0) 2007.12.02
▣ 지구는 초만원  (0) 2007.12.02
▣ 텔레파시  (0) 2007.12.02
▣ 텔레파시

준비물 - 메모지 4-5장, 볼펜 4-5자루, 점수판
- 조를 나누어 먼저 조장을 선출한다. 그리고 각 조장에게 종이와 볼펜을 나누어 주고 종이를 8등분하여 접으라고 한다. 이때 각 조원들은 둥그렇게 무릎을 맞대고 앉게 한다.
- 리더는 각 조원들에게 16절지 왼쪽 첫째 칸에 서로 협의하여 생선이름 3가지를 기록하도록 한다. 이때 각 조원들이 주의 할 점은 진행하는 리더나 다른 조원들에게 들리지 않도록 떠들지 말고 기록해야 한다.  
- 왼쪽 첫째 칸에 생선이름 3가지를 다 기록하였으면 둘째 칸에는 산이름 3가지, 셋째 칸에는 20대가 가장 좋아하는 노래 3곡, 넷째 칸에 는 우리나라 여자 이름중 가장 흔한 이름이나 시골스러운 이름 3가지, 가정집에 사는 해충, 벌레 3종류 등을 기록하도록 한다.

- 기록이 다 끝났으면 다시 한번 확인하게 한 다음 리더는 각 조원들에게 자기 조가 기록한 32개의 이름을 1분안에 암기하도록 한다. 암기가 끝났으면 리더는 각 조장을 통하여 기록한 용지를 다 회수한다.
- 그리고 리더는 이렇게 말한다. 지금부터 이 용지를 보지 않고 순서대로 이름 1가지 리더 맘대로 부르는데 이때 자기 조원들이 기록한 이름과 같을 경우 양팔을 들고 일어서며 최대한 소리를 지르도록 한다. 이때 소리는 '오! 예'로 한다. 소리를 잘 지르는 팀은 보너스 점수를 주도록 하며 이와 반대로 소리가 작을 때는 점수를 깍도록 한다.
- 리더는 각 제목의 이름을 4-5개 정도만 불러주고 특이한 이름(예 : 꽃-며느리 밥풀꽃, 벌레-바퀴벌레, 돈벌레, 시골스러운 여자 이름-영순, 순자 등)을 불러줄 때는 점수를 많이 걸어놓고 한다.
- 점수는 보통 100점, 특별점수 300점, 500점을 걸어 좋고 하는데 이렇게 되면 역전기회가 주어지게 되어 게임 진행이 더욱 흥미진진하게 된다.

'레크레이션 > 팀대항 게임' 카테고리의 다른 글

▣ 개미떼 풍선터트리기  (0) 2007.12.02
▣ 촛불들고 달리기  (0) 2007.12.02
▣ 제스츄어 릴레이  (0) 2007.12.02
▣ 지구는 초만원  (0) 2007.12.02
▣ 우리팀의 I Q  (0) 2007.12.02
가장 멋진 대답


방 법

각 조를 나누어 리더가 '몇 조'하고 부르면 '오! 예, 와, 응, 오냐'라는대답을 한다.
가장 큰소리로 대답하도록 경쟁을 시켜 즉석에서 점수를 준다. 위 활동은 각 조를
나눈 뒤에 곧바로 하거나 분위기가 산만할 때 하면 효과적이다.
그리고 조별로 팀웤을 형성하는데도 큰 도움이 된다.  

'레크레이션 > 분위기 조성 게임' 카테고리의 다른 글

땅 따 당  (0) 2007.12.02
청개구리 대답  (0) 2007.12.02
반대동작  (0) 2007.12.02
함정있는 노래  (0) 2007.12.02
엉뚱한 인사말  (0) 2007.12.02
땅 따 당


방 법

- 리더가 '땅'하면 참가자들은 '따당'해야 한다. 그리고 '따당'하면 '땅'해야 하는 것이다.
아래와 같이 자주 바꿔서 하면 재미있다.

예)
땅 → 따당
따당 → 땅
땅,땅 → 따당,따당
따당,따당 → 땅,땅
땅,따당 → 따당,땅
따당,땅,땅 → 땅,따당,따당

- 분위기에 익숙하여지면 빠른 속도로 총을 쏘고 참가자들이 대답을 하도 록 한다.
총은 오른손 주먹을 가볍게 쥐고 집게 손가락을 펴서 하면 '주 먹총'이 된다.

- '땅' 외에도 짠-짠짠, 뻔-데기,쿵-짝짝, 칙칙-폭폭 등이 있다.

'레크레이션 > 분위기 조성 게임' 카테고리의 다른 글

가장 멋진 대답  (0) 2007.12.02
청개구리 대답  (0) 2007.12.02
반대동작  (0) 2007.12.02
함정있는 노래  (0) 2007.12.02
엉뚱한 인사말  (0) 2007.12.02
청개구리 대답


방 법

- 리더가 어떤 질문을 하면 참가자들이 그것에 관하여 '예', '아니오'로 대 답하되 머리를 흔드는 것은 반대로 하는 게임이다.

예) '여러분은 돼지하고 친구이지요 ?' 하고 물으면 참가자 들은 '아니요' 라고 대답하면서 동시에 머리는 상 하(예)로 흔든다.

'레크레이션 > 분위기 조성 게임' 카테고리의 다른 글

가장 멋진 대답  (0) 2007.12.02
땅 따 당  (0) 2007.12.02
반대동작  (0) 2007.12.02
함정있는 노래  (0) 2007.12.02
엉뚱한 인사말  (0) 2007.12.02
반대동작


방 법

- 다함께 노래하는 도중 리더가 어떤 율동을 하게 되면 참가자들은 반대로 따라 해야 한다.

즉 노래에 맞추어 리더가 손을 올리면 반대로 손을 내리 는 동작을 하면 된다.

이외 상하 좌우동작 등 양손을 가지고 하면 재미있다.

'레크레이션 > 분위기 조성 게임' 카테고리의 다른 글

가장 멋진 대답  (0) 2007.12.02
땅 따 당  (0) 2007.12.02
청개구리 대답  (0) 2007.12.02
함정있는 노래  (0) 2007.12.02
엉뚱한 인사말  (0) 2007.12.02
함정있는 노래


방 법

- 가사가 반복되는 노래를 선정하여 반복되는 가사는 빼고 노래하는 게임 이다.

- 예 -

아버지는 나귀타고 장에 가시고
나의 살던 고향은 꽃피는 산골
산 위에서 부는 바람 시원한 바람
아름다운 노래 정든 그 노래가
우리 처음 만난 곳도 목화밭이라네
토요일 밤 토요일 밤에 나 그대를 만나리
저 논속에 맹꽁이가 울어 제끼네

'레크레이션 > 분위기 조성 게임' 카테고리의 다른 글

가장 멋진 대답  (0) 2007.12.02
땅 따 당  (0) 2007.12.02
청개구리 대답  (0) 2007.12.02
반대동작  (0) 2007.12.02
엉뚱한 인사말  (0) 2007.12.02
엉뚱한 인사말


방 법

- 인사말 원고는 사전에 작성하되, 그 활동의 분위기와 어울리는 내용으로 만든다. 그리고 형용사는 모두 뺀다. 그리고 리더는 참가자들에게 형용사 를 한가지씩 말하게 하여 빈 칸에 하나씩 차례대로 넣도록 한다.

- 빈 칸이 모두 메워지면 리더는 만들어진 인사말을 또박 또박 읽어 내려 간다(배경 음악과 함께) 그런데 인사말을 하는 도중에 말도 안되는 엉뚱 한 말들이 튀어 나오기 때문에 장내에는 폭소가 터지고 만다.

- 인사말 예 -
오늘 뜻깊은 이 자리에서 우리의 우정을 나누게 되어서 (슬픕니다) 우리는 서로 격려해 주고 칭찬해 주며 또한 아 껴주고 이끌어 주며 뜨거운 마음으로 (많이 먹어야 합니다)



준비물

- 형용사를 뺀 인사말 원고, 배경 음악

'레크레이션 > 분위기 조성 게임' 카테고리의 다른 글

가장 멋진 대답  (0) 2007.12.02
땅 따 당  (0) 2007.12.02
청개구리 대답  (0) 2007.12.02
반대동작  (0) 2007.12.02
함정있는 노래  (0) 2007.12.02

테스트


1. 오랫동안 세탁 안 한 청바지도 아무렇지 않게 입는다. (YES-3, NO-2)


2. 매일 목욕한다. (YES-4, NO-8)


3. 길 한복판을 걷고 있을 때가 많다. (YES-10, NO-5)


4. 사람들이 많이 모이는 곳에 가기 싫다. (YES-6, NO-7)


5. 갑자기 큰소리를 낼 때가 있다. (YES-10, NO-14)


6. 외출 준비시간이 30분 이상 걸리는 편이다. (YES-11, NO-12)


7. 외출 준비시간이 30분 이상 걸리는 편이다. (YES-11, NO-12)


8. 오락실 게임보다는 집에서 컴퓨터로 게임을 즐기는 편이다. (YES-12, NO-13)


9. 내 얼굴이 이상하게 나온 사진은 절대 남에게 안 보여준다. (YES-14, NO-15)


10. 놀러가서 여러 남자친구(여자친구) 들과 함께 잠을 자도 상관없다. (YES-20, NO-15)


11. 살균용 연고를 꼭 같고 다닌다. (YES-16, NO-13)


12. 휴대폰은 필수품이다. (YES-13, NO-17)


13. 지하철이나 버스에서 껌이나 사탕이외의 것을 먹은 적이 있다. (YES-14, NO-18)


14. 남자(여자)에게 먼저 사랑 고백을 한 적이 있다. (YES-19, NO-18)


15. 부모와 싸움을 자주 하는 편이다. (YES-20, NO-19)


16. 상대의 눈치를 보며 행동하는 일이 많다. (YES-A, NO-B)


17. 싫은 일이 있으면 확실히 싫다고 말한다. (YES-C, NO-B)


18. 남이 말하는 중에 끼어들어 말하는 때가 많다. (YES-19, NO-17)


19. 화가 나면 참지 못하는 성격이다. (YES-D, NO-C)


20. 길거리에서 남자친구(여자친구)와 포옹한 적이 있다. (YES-E, NO-D)


우리 집 정원을 내 손으로 직접 꾸민다면 그 모습이 어떨까요?

1. 숲같은 정원

2. 나무들 사이로 햇빛이 비치는 정원

3. 나무 한 그루만 있는 정원

4. 작은 나무들만 있는 정원




바닷가에서

새해 첫 날 그(그녀)와 함께 정동진에 떠오르는 해를 보러갔다.
해가 막 떠오를 순간 앞에 서있던 남녀의 대화를 듣게 되엇다.

뭐라고했을까?

1.  어머.. 정말 멋있다!

2. 사랑해...

3. 너무 추워..

4. 사진 찍을래!




당신의 선택은??.
예, 저도 초보입니다...
경력이야 쬐금 될지 몰라도, 제가 모르는 세상의 수많은 기술들을 보다 보면, 아직도 초보라는 생각 밖에 안드네요.

하지만, 그나마 지금까지 프로그래머로서 밥 벌어먹고 사는 동안에 나름대로 느낀 것이 있어서 공유하고자 합니다.


1. 당신이 지금 하는 고민은 이미 누군가가 한 고민이다.
=> 웹이건 어디건 좋다. 일단 죽도록 찾아라. 찾는데 투자하는 시간을 아까워하지 말라. 당신이 고민해서 해결하는것 보다는 빠를 것이다. 만일 결국 찾지 못한다면, 못 찾은 후 해야할 남은 고민은 자신이 세계 최초라는 사실을 자랑스러워하고 난 다음에 해도 늦지 않다.

2. 머리보다 손이 더 잘 생각한다.
=> 보기 좋지 않아도, 개발새발이어도 좋다. 자신의 생각들을 적어가면서 고민해라. 가능하면 소프트웨어 개발 방법론등에 나와 있는 여러 가지 표준화된 양식으로 적어대면 더 좋겠지만, 뭐 어떤가? 나만 알아볼 수 있으면 되지. 덤으로, 일단 적어놓은 것은 수단방법을 가리지 말고 날짜별로 관리하라. 훗날 자신의 생각이 어떻게 바뀌어 갔는지에 대한 증언이 되어 준다. 지금 적은 자그마한 메모 하나가 나중에 큰 고민 하나를 줄여준다는 것을 명심하라.

3. 내 머리로 생각하고, 내 손으로 해본 것만이 진짜 자신의 것이다.
=> 책 읽고 예제 따라해봤다고 책의 내용이 자기 것이 되지는 않는다. 꼭꼭 씹어먹지 않으면 손가락 사이로 흘러버릴 것이다. 왜 그런지, 과연 그것이 맞는지, 항상 의심하고 스스로 생각하라. 그리고 생각해봤다면, 그것이 맞는지 직접 해봐라.

4. 레퍼런스와 테크니컬 아티클은 나의 바이블이다.
=> 근본적으로, 내가 알아야 할 모든 것은 업체로부터 받은 레퍼런스와 세상의 모든 선배들이 적어 놓은 테크니컬 아티클에 이미 있다. 항상 읽고 확인하기를 게을리하지 말아야 한다.

5. IT의 1년은 세상의 10년이다.
=> 최신 기술 동향에 항상 귀기울일 것이며, 무엇이 이슈인지를 눈으로 확인하라. 당장 자신에게 필요없다고 해서 관심을 두지 않는다면 몇년 후 시대에 뒤떨어진 자신을 발견하게 될 것이다. 프로그래머에게 있어 신기술 습득은 평생을 함께 할 반려자이니 이와 결혼할 용기가 없거든 부디 다른 직업을 알아볼 것을 권한다.
요즘은 온통 웹사이트 만드는 일로 골치 아프다. 본래 이 분야가 본업도 아닌데 어쩌다가 하게 됐다. 싫지도 않지만 즐겁지만도 않다. 언젠가 소설을 읽으며 졸은 적이 있다. 너무 따분했지만 불멸의 명작이라니까 꾹 참고 읽어나가다가 몇 분 후 졸기 시작한다. 물론 여름이었다. 더위 때문이기도 했다. 돌이켜보면 인식의 도약 같은 건 있었다. 문학적 감수성이 풍부한 사람이라면 고등학교 때 띄었음직한 마르셀 프루스트의 '잃어버린 시간을 찾아서'다. 몇 년 전에 11권인가 전권을 구입해놓고 시간 날 때마다 조금씩 읽는다. 대신 한 권을 독파할 때 마다 한 번을 더 읽는다. 그래서 무자게 느리고 아직도 진행중이다. 본래 소설을 야금야금 읽는 편이다.

사용자 삽입 이미지
요즘은 인터넷 웹프로그램을 익혀서 끄적대는데 깨알같은 알파벳과 이상한 기호들이 일목요연하게 늘어선 형국이 졸음오기 딱 좋다. 덥지 않은 게 천만다행이다. 평소 글 쓸 때도 오타를 많이 치는 편인데 프로그램 언어에서는 점이나 콤머 하나 잘못 찍어도 전체가 망가지는 일도 흔하다. 그런 프로그램 생태계가 숨막히게 한다. 비인간적이게 느껴진다. 그래도 로마에 왔으니 로마법을 따르는 수밖에.

정말 다르다. 마치 뇌부위의 다른 면을 사용하는 것 같다. 적응하려면 시간이 걸린다. 쉽게 말하면 축구하고 방에 들어오자 마자 미분적분을 흥미롭게 집중하는 것과 비슷하다. 물론 그런 걸 잘하는 사람도 있긴 있다. 어쩌면 내가 좀 이상한지 모르겠다. 영화, 게임, 만화, 그림, ... 주로 감수성을 다루는 분야의 뇌부위를 오래동안 사용하다가 느닷없이 논리적이고 정교해야하는 뇌부위, 아마도 왼쪽뇌를 사용하려니까 적응하기 힘들다. 며칠을 그렇게 지내다보니 어느 정도 익숙해지긴 했다. 그럴려고 노력하다보니 영화 보는 것, 글 쓰는 것도 잘 되지 않는다. 같은 글을 써도 전혀 다른 뇌부위를 사용하는 글쓰기라 왔다갔다 왕복하기 힘들다. 그래서 최근 이 블로그에 긴 글을 쓰는 걸 잠시 접었다. 일단 웹사이트 만드는 작업을 어느 정도 끝내야만 다시 오른쪽 뇌를 사용해서 영화, 만화, 드라마를 보고 이곳에 글을 적을 수 있을 것 같다.

그렇다고 하루 종일 집중해서 웹사이트 관련 작업을 하는 것도 아니다. 그런 인물은 아니다. 한쪽으로 치우치면 다른 쪽을 잘 할 수 없는 기질인 것 같다. 작업을 하지 않을 때는 빈둥거리거나 웹사이트 탐험한다.

대충 아래와 같은 사이트다. 웹2.0 쉬크라고 할 수 있는 사이트만 모았다. 기술적인 것은 자세히는 모르겠고 웹디자인이 웹2.0 이라고 할 수 있다. 여기서 오해하지 말아야 할 것은 플래시, 화려한 브로마이드 같은 웹디자인을 말하는 게 아니다. 기능 위주의 깔끔하고 간결한 상호작용 디자인을 말한다.


http://www.reevoo.com/
이런 레이아웃이 웹2.0 쉬크 느낌이다.

http://labs.digg.com/
digg.com 을 만든 회사에서 실험적으로 만들어보는 사이트 같다.

http://www.readwriteweb.com/
레이아웃이 웹2.0 이다.

http://eventful.com/
미국 각 주에서 열리는 이벤트, 파티, 공연 등을 다루는 웹2.0 사이트다.
국내에서도 비슷한 사이트가 얼마전 생긴 것 같다.
개인적으로 재밌어 보이는 사이트다.

http://www.minglenow.com/
대단히 웹 2.0 스타일 디자인이다. 미국 미팅 사이트지만 특별히 파티를 다룬다. 파티에서 젊은 연인들이 만나는 걸 주선하는 사이트인 것 같다.

http://rutube.ru/
러시아 동영상 공유 사이트인데 디자인이 깔끔한 편이다.

http://www.lumosity.com/
두뇌를 개발해서 좀더 똑똑해지고 싶다면 방문하기 좋은 사이트다. 관심있는 사람은 먼저 영어를 배워야 하니까 이미 두뇌 개발을 시작한 셈이다. 사이트 색감이 따뜻하고 좋다고 느꼈다.

http://musicovery.com/
다양한 웹라디오를 들을 수 있는데 인터페이스가 독특하다. 전문 기술적인 분야라 잘 모르지만 방바닥에 널려 있는 라디오를 끌어다 듣는 것과 비슷하다. 이런 디자인을 웹2.0 스럽다고 하지는 않느다. 몇 년 전이나 몇 년 후에 나왔더래도 독특할테니까 말이다.

http://www.virb.com/
이런 디자인을 웹2.0 스럽다고 할 수 있다. 음악 관련 커뮤니티다. 시원스럽고 널널한 디자인, 그러면서 중요한 기능은 거의 다 있다. 꼭 오밀조밀 모아놓아야 한다는 편견은 몇 년 전 웹디자인의 관습이다.

http://www.humblevoice.com/
바로 위에 사이트와 분위기가 꽤 유사하다. 유능한 젊은 그래픽 아티스트가 많은 편이다. 좀 기괴한 그림도 많지만 예술적이다. 이런 웹디자인이 웹2.0 스럽다고 할 수 있다.

http://sketchcast.com/
스케치 동영상을 공유하는 사이트다. 첫페이지 디자인이 엄청 쉽고 깔끔하고 직관적이어서 바로 어떤 사이트인지 초딩도 알 수 있을 거다. 비슷한 서비스를 하는 국내 인터넷 기업도 있다.

http://www.digitick.com/
프랑스 사이트인데 정보는 많고 분위기 화려하지만 왠지 복잡하고 한 눈에 들어오지 않는다. 이런 사이트가 애늙은이 디자인이라고 할 수 있을지 모르겠다. 색감은 화려하고 젊고 활기찬데 인터페이스나 레이아웃은 구시대적이다.

http://iminlikewithyou.com/
전체가 플래시지만 상호작용적이고 기능적이고 재밌게 만들었고 무엇보다 기존 웹디자인 인터페이스와 많이 다르다. 단지 화려한 동영상 보여주는 플래시가 아니다. 미국 젊은이들 미팅 사이트다. 특이한 점은 사진을 보고 경매가를 적는다. 나이트 같은 곳에서 연인을 경매로 사는 것과 비슷하다. 웹디자인이 대단히 웹2.0 적이다. 국내에서도 비슷한 사이트가 생길 것 같다. 단지 연인 경매를 말하는 게 아니라 이런 인터페이스 디자인의 웹사이트를 말하는거다.

http://www.going.com/
미국 여러 도시 이벤트를 통해 사람을 연결하는 사이트다. 디자인과 기능이 웹2.0 적이다. 아직 한국은 미국만큼 파티 문화는 아니다. 대도시 특정 지역에 한정 되어 있기 때문이다. 그러나 앞으로 한국적인 파티 문화가 지속적으로 성장할 것 같다.


더 많지만 이 정도면 대충 웹2.0 쉬크가 어떤 느낌인지 가늠할 수 있을 것 같다.
1명품 밝히면 내 등이 휘잖아

그녀의 취미는 명품 사 모으기. 사주는 것도 한두 번이지, 남자친구 뼛골이 휜다. 처음엔 럭셔리해 보였던 그녀가 점점 한심하고 얄미운 된장녀처럼 보이는 건 왜일까?

결정적으로 그녀는 부잣집 딸내미도 아니다. 그녀와 결혼은 해도 될까? 답은, 이 결혼 절대 안 한다네.

2공주병 심하면 머리 아파

가방 들어주고, 심기 건드리면 안되고, 절대“안 예쁘다”는 말은 하면 안되고. 무조건 공주님 대우 해줘 야 하는 그녀. 남자도 왕자 대우 받고 싶다. 하지만 지금은 왕자는커녕 노예잖아? 공주병이 계속되면 정말 남자는 피곤하다. 때론 왕자 대우해주는 여자 찾아 나도 떠나고 싶어~.

3 외모는 좀 꾸몄으면 좋겠는데...

욕 좀 먹어도 좋다. 외모 밝히는 ‘나쁜 놈’이라고 비난 해도 좋다. 그래도 남자는 여자가 예뻤으면 좋겠 다. 좀 꾸몄으면 좋겠다. 여자친구가 너무 안 꾸미면 자꾸 다른 여자에게 눈이 간다.

4 욕 잘하는 너, 여자 같지 않아

여자끼리는 욕 잘하는 게 멋있다고 생각하나?하지만 남자는 욕 잘하는 여자가 싫다. 여자로 보인다기보다 는 그냥 남자 같다. 환상도 '팍' 깨진다

5 의심 좀 그만해! 너무 무서워

여자는 의심 많은 남자를 보면, 의처증 남자가 등장하는 스릴러물 <적과의 동침>을 연상한다. 반면 남자는 의심 많은 여자를 보면 <미저리>를 연상한다. 의심 많은 그녀가 자신을 어딘가에 가둬놓고 반미치광이처럼 망치를 휘두르며 자꾸 진실을 말하라고 요구할 것만 같은 착각에 빠지는 것이다. 그러니 여자분들, 과도한 의심은 그만!

6 사랑을 왜 받기만 하니?

내가 열번의 사랑을 주면 한 번의 사랑을 되돌려줄까 말까 하는 그녀. 간혹 바쁘거나 힘들어서 소홀하면 “사랑이 식었다”며 난리 부르스인 그녀. 넌 어떻게 사랑을 받을 생각만 하니? 나도 지친다, 지쳐

7. '화장빨' 좀 그만 살리자

미안하다. 외모 이야기 한번만 더 하자. 긁으면 한 꺼풀 벗겨질 듯한 ‘가부키’화장을 하는 그녀들이여! 제발 돈 들여서 스킨 케어를 받던가 하시기를.

솔직히 남자는 자기 친구들에게 소개시키기 부끄러 울 때도 있다. '화장빨'인 여자친구를 둔 죄다.

8 대화가 안 통하면 나도 답답해

입만 열면 시답잖은 연예인 이야기, 사고 싶은 옷 이야기 ,먹고 싶은 음식 이야기, 누가 자기 예쁘다고 칭 찬한 이야기. 내가 관심 있어하는 분야는 무시하고 일방통행만 하는 그녀. 정작 자기 남자친구와 소통을 못한다. 남자의 관심분야도 파악하고 대화하려고 노력 좀 해보자.

9.오직 '남자' 밖에 모르다니!!

남자친구에게 의존한다. 세상의 중심은 남자다. 오직 남자 밖에 모른다. 남자는 자기 일에도 열정을 가지 고 때론 당찬 여자가 매력적이라 여긴다.

너무 남자밖에 모르지 마라. 남자가 부담스러워서 오히 려 떠나갈지 모른다

자기점검 후 심하다 싶은 습성은 개조해보는 것이 좋다. 그 정도는 애인을 위해, 또 나를 위해 해볼만하니까.

하지만 습성을 고치기 싫다면 다른 방법도 있다. 왜 있잖은가. 커플 들의 흔한 이별사유, “그냥 안 맞아서 헤어졌다”는 것. 다 그렇다. 습성이 안 맞고, 또한 고치기도 싫다 면 헤어질 수밖에 없다.

Q.내 애인이지만, 정말너무하다, 싶은 습성이 있나요?
1. 무가지 대(大)자로 펼치고 보는 사람
몇 년전부터 무가지가 지하철 출근시 최고의 파트너가 되었습니다. 참 고맙죠.(하지만 기존 신문사들 다 망합니다) 아침출근하는 시간을 이용해 뉴스를 보는 사람들~!! 하지만 복잡한 열차안에서 남에대한 배려가 전혀없이 신문을 쫘~악 펼쳐놓고 보는 사람들이 짜증나게 합니다.
그러지 맙시다.

2. 남자는 이런사람 못 봤다. 여자만 해당되는 내용인가?(여성비하는 아님)
머리 말리지 않고 다니시는 여성분들~!!
콩나무시루처럼 빼곡하게 열차에 타다보면 본의아니게 옆, 앞뒤사람과 신체 접촉을 하게 됩니다. 그때 머리를 덜 말린 사람뒤에 서면 정말 짜증이 나죠.ㅠㅠ
말리고 다닙시다.
건강tip
머리를 말리지않고 젖은 상태로 외출하거나 곧바로 누워버리는 일은 하지말아야한다.
외출시 공기 중 여러 오염물질이 수분과 함께 모발에 붙게되며 그대로 잠자리에 드는 경우 두피속 습기가 가득한 환경은 수많은 박테리아와 곰팡이를 생산해 낸다. 또한 추운 겨울철....감기걸릴 확률도 높아진다


3. 이어폰이냐 스피커냐?
예전부터 이어폰 볼륨을 크게 들으면 안된다는 내용의 기사가 꽤 많이 나왔습니다. 이는 개인의 건강과 더불어 타인에 대한 매너 문제라고 생각합니다. 특히 요즘같은 경우 DMB폰을 쉬게 볼수 있는데...이어폰도 안 낀채 볼륨을 크게 높이고 그냥 보는 사람들 짜증납니다
건강tip
큰소리로 음악을 듣는것이 습관화될경우 소리가 잘 들리지않는 '소음성난청'이 생길수 있다. 특히 고주파 음에 대한 장애때문에 여성이나 아이의 목소리를 제대로 못 듣는다. 귀에서 귀뚜라미 소리같은것이 맴도는 이명이 사나흘 계속되기도 한다. 그밖에도 온몸이 피곤하고, 잠이 오지않으며, 심할경우 고혈압과 소화불량, 집중력저하 등과 같은 신체증상도 나타난다
스크랩 금지된 네이버 블로그와 카페글을 스크랩하고 싶다면...
해당 게시물을 띄운 상태에서 아래와 같은 자바스크립트를 사용하면 필요한 내용들을 복사해서 사용할 수 있습니다. 그러나 저작권이 있는 자료인 경우는 주의 깊게 사용할 필요는 있겠지요.

우선 네이버 블로그 게시물에 사용할 수 있는 자바스크립트입니다.

javascript:function x(){mainFrame.papermain.document.body.oncontextmenu=null;mainFrame.papermain.document.body.onselectstart=null;mainFrame.papermain.document.body.ondragstart=null} x();

이번에는 네이버 카페 게시물에 사용할 수 있는 자바스크립트입니다.

javascript:function x(){document.body.oncontextmenu=null;document.body.onselectstart=null;document.body.ondragstart=null;cafe_main.document.oncontextmenu=null;cafe_main.document.onselectstart=null;cafe_main.document.ondragstart=null;} x();

원리는 간단합니다. 해당 객체의 이벤트를 무력화 하는 것입니다. 응용하시면 다른 사이트에서도 활용하실 수 있겠죠.
자바스크립트를 모르는 분들을 위해 부연 설명을 하면, 주소 창에 위에 있는 스크립트를 한줄이 되도록 복사 후에 붙여 넣기 하시면 됩니다. 더 편하게 사용하려면 아무 웹페이지나 즐겨 찾기를 해둔후 속성을 변경하면 되는데, 속성창에 url를 위 자바스크립트로 대체하시면 됩니다. 즐겨찾기 이름은 간단하게 정하시고, 해당 즐겨찾기의 이름을 주소창에 입력하시면 간단히 원하는 사이트로 가거나 자바스크립트를 실행시킬 수 있습니다.
자주 이용하는 사이트라면 즐겨찾기 이름은 숫자나 영문자 1자로 정하면  더 편합니다.
주소창으로 바로가는 단축키 ALT+D 와 함께 이용하시면 더욱 좋겠죠.
스킨을 바꿧어용... ㅎㅎ

데이지 님께서 이번에 새로 올려주신 스킨..으로~~고고싱~~

주소 : http://daisy.pe.kr/ 가시면 스킨 이 새로 올라왔네용... ㅎ
( 대이지님 고맙습니다...^^* 스킨 잘~ 쓰겠습니당...^^* )

수킨 수정하고 구글광고 붙이고 했는데... 느낌이 같은 블로그 같아서... 이거 참.... 난감하넹... ㅎㅎ

바꿔야하는데... 시간도 없고... 귀찮기도 하고...

그래서!! ㅋㅋ

그냥 이렇게 놔두기로...ㅡ,.ㅡ;;

오른쪽에 사진이 떡하니 있으니... 제 블로그인지 다들 아실꺼라는 생각에... 후후후~~

언제쯤 난 내 전용 스킨을 만들어서 사용해 보나... ㅎ

나도 데이지님 처럼... 스킨을 만들어서 나만의 스킨을 사용해 보고 싶다는...ㅡ,.ㅡ;

아~ 스킨도 다~~~ 바꿧으니 이제 자야죵~~ㅎㅎ

모두들 안녕히 주무셔용~~

1. 화가 났을 땐 30분 이상 생각한 다음 문자를 보내야 화를 면한다.


2. 고백이나 사과를 할 땐 문자 보단 직접 만나서 이야기를 하도록 하자.
   문자는 그 사람의 눈빛, 어투, 태도 등이 생략되어 있기 때문에
   오해의 여지를 안겨줄 가망성이 크다.


3. 상대방이 문자를 씹었다고 해서, 곧바로 삐진 듯한 느낌을 심어주는 문자를 보내어선 안 된다.


4. 문자로 밀고 당기기를 하기 위해선, 절대 문자를 씹지 말고, 문자의 단어 수를 조절하도록 하자.


5. 하루 15통 이상의 문자는 스토커, 집착하는 사람의 이미지를 심어줄 가망성이 크다.


6. 전화를 1번 걸었다면 문자를 3번, 전화를 3번 걸었다면
   문자를 1번 식으로 정보망을 단축시키도록 하자.
   정보망이 두터워질수록 집착에 빠질 가망성이 크다.


7. 문자를 보낼 때 발신자를 '1004'등으로 찍어서 보내지 마라.
   요즘은 이런 비밀스런 발신문자에 무신경 할 뿐 아니라, 반발심까지 느끼게 된다.


8. 휴대폰 밧데리가 다되기 전에, 사랑하는 상대에게 문자로 먼저 통보해주도록 하자.
   그래야 폭탄문자를 면할 수 있다.


"문자 하나에 사랑의 운명이 뒤바뀐다!

'이야기 광장 > [감성]격언, 조언' 카테고리의 다른 글

This is LOVE  (0) 2010.07.29
[빌게이츠]빌게이츠의 78가지 성공 명언  (0) 2008.01.17
스트레스 관리 10계명  (0) 2006.10.22
이런 남자가 성공한다..  (0) 2005.06.08

가상 아이피를 설정하는 또다른 방법은

직접 가상장치에 대한 네트웍 설정 파일을 만드는것이다.


eth0 장치에 대한 설정을 하고 가상아이피를 설정을 하고자 하면


# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.123.250
GATEWAY=192.168.123.254
NETMASK=255.255.255.0



# vi /etc/sysconfig/network-scripts/ifcfg-eth0:0
DEVICE=eth0:0
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.123.251
GATEWAY=192.168.123.254
NETMASK=255.255.255.0


위와같이 두개의 파일을 만들고 서비스를 다시 시작해야 하는데


# service network restart  혹은  # /etc/init.d/network restart

이렇게 해주면 된다.


####### 그외의 옵션들 #######

DEVICE="eth0"
ONBOOT="yes"
BOOTPROTO="none"
IPADDR="61.1.2.3"
NETMASK="255.255.255.0"
#GATEWAY=210.221.183.1
IPXNETNUM_802_2=""
IPXPRIMARY_802_2="no"
IPXACTIVE_802_2="no"
IPXNETNUM_802_3=""
IPXPRIMARY_802_3="no"
IPXACTIVE_802_3="no"
IPXNETNUM_ETHERII=""
IPXPRIMARY_ETHERII="no"
IPXACTIVE_ETHERII="no"
IPXNETNUM_SNAP=""
IPXPRIMARY_SNAP="no"
IPXACTIVE_SNAP="no"


####### 네트웍 관련된 다른 설정 파일들 #######

/etc/hosts 호스트이름과 IP주소를 적는파일.
/etc/resolv DNS 서버주소를 적는 파일
/etc/sysconfig/network 호스트이름,게이트웨이가 들어 있는 파일
/etc/sysconfig/static-routes Static 경로가 있는 경우 적는 파일
/etc/sysconfig/ipchain ipchain 이라고 Masquerading(NAT) 또는 Firewall관련 설정
/etc/sysconfig/firewall firewall 관련 설정
/etc/sysconfig/network-scripts/ifcfg-eth0 eth0에 대한 설정. IP주소, 넷마스크 등이 들어감
/etc/sysconfig/network-scripts/ifcfg-eth1 eth1에 대한 설정.

'공부 해 Boa요. > Linux Server' 카테고리의 다른 글

IPTABLE 기본 사용법  (0) 2008.03.10
Apache Tunning  (0) 2008.03.10
리눅스 가상 IP 설정Ⅰ  (0) 2007.11.23
리눅스시스템 정보 보는 방법  (0) 2007.11.10
리눅스명령어 - 시스템 정보  (0) 2007.11.10

가상 IP를 설정하는건 의외로 아주 간단하다.

# ifconfig <장치명> <가상의 IP>


먼저 기본적인 네트웍 설정상태를 먼저 확인해 보면

# ifconfig

eth0      Link encap:Ethernet  HWaddr 00:07:E9:40:7D:E6
          inet addr:192.168.123.250  Bcast:192.168.123.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:397962 errors:0 dropped:0 overruns:0 frame:0
          TX packets:405098 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:49081880 (46.8 Mb)  TX bytes:416655013 (397.3 Mb)
          Interrupt:20 Base address:0x1400 Memory:fe7e0000-fe7e0038

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:1332 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1332 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:95987 (93.7 Kb)  TX bytes:95987 (93.7 Kb)


만약 이더넷 카드가 두개라면

eth1 이라는 정보가 하나 더 표시될것이다.


장치 이름은 기본 장치명에 콜론(:)을 붙이고 가상 장치에 순번을 붙이면 된다.

예) eth0:0, eth0:1, eth0:2 ....


# ifconfig eth0:0 192.168.123.251


이렇게 입력하고 다시 확인해 보면 eth0:0 라고 확장된 장치를 볼 수 있다.


eth0      Link encap:Ethernet  HWaddr 00:07:E9:40:7D:E6
          inet addr:192.168.123.250  Bcast:192.168.123.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:397962 errors:0 dropped:0 overruns:0 frame:0
          TX packets:405098 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:49081880 (46.8 Mb)  TX bytes:416655013 (397.3 Mb)
          Interrupt:20 Base address:0x1400 Memory:fe7e0000-fe7e0038

eth0:0    Link encap:Ethernet  HWaddr 00:07:E9:40:7D:E6
          inet addr:192.168.123.251  Bcast:192.168.123.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Interrupt:20 Base address:0x1400 Memory:fe7e0000-fe7e0038

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:1332 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1332 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:95987 (93.7 Kb)  TX bytes:95987 (93.7 Kb)


이런 방법으로 가상아이피는 제한된 갯수까지 늘릴수가 있지만

이러한 경우 서버를 재부팅할 경우 다시 설정해 주어야 하는 단점 때문에

장치에 대한 설정을 파일로 저장하고 부팅시 자동으로 실행 시키는 것이 좋다.

'공부 해 Boa요. > Linux Server' 카테고리의 다른 글

IPTABLE 기본 사용법  (0) 2008.03.10
Apache Tunning  (0) 2008.03.10
리눅스 가상 IP 설정Ⅱ  (0) 2007.11.23
리눅스시스템 정보 보는 방법  (0) 2007.11.10
리눅스명령어 - 시스템 정보  (0) 2007.11.10

<form name="dynamicselector">
<table border="0" cellspacing="0" cellpadding="0" height="178">
<tr>
<td width="35%" valign="top" align="left">
<select name="dynamicselector2" size="4" onChange="generateimage(this.options[this.selectedIndex].value)">

            <option value="박재원" selected>박재원</option>
            <option value="박재원1">박재원1</option>
            <option value="박재원2">박재원2</option>
            <option value="박재원3">박재원3</option>
            <option value="박재원4">박재원4</option>
</select>
</td>
<td width="65%" valign="top" align="left"><ilayer id="dynamic1" width=100% height=178>
<layer id="dynamic2" width=100% height=178><div id="dynamic3"></div></layer></ilayer></td>
</tr>
</table>
</form>

<script>
var tempobj=document.dynamicselector.dynamicselector2

function generateimage(which){
    if (document.all){
        dynamic3.innerHTML=which
    }
        else if (document.layers){
            document.dynamic1.document.dynamic2.document.write(which)
            document.dynamic1.document.dynamic2.document.close()
        }
        else
            alert('본 스크립트를 지원하지 않는 브라우져 입니다.')
    }

function generatedefault(){
    generateimage(tempobj.options[tempobj.options.selectedIndex].value)
}
    if (document.all||document.layers){
    if (tempobj.options.selectedIndex!=-1)
    window.onload=generatedefault
}
</script>

요즘 한창 뜨고 있는 웃긴 동영상 중 하나이다...

아무런 사운드 없이 동영상이 계속해서 나온다....
하지만 보면 볼 수록 웃긴다...
결국 점점 웃기다 못해... 울기까지 했다...

점점 익숙해져 가는 얼굴에 웃음늠 더욱더 커져 간다...




피곤하고 오만 스트레스로 머리속이 복잡해진...
나에게 큰 웃음을 주신 이분...

너무 대단하십니다...

고맙습니다... 보면 볼 수록 웃음을 주는 그녀... 거울녀... ㅎ

가로, 새로 한 평이 채 안 되는 비좁은 공간. 이 땅의 많은 직장인들이 하루를 보내는 곳, 바로 책상 앞이다. 컴퓨터와 서류 더미들에 둘러싸여 종종거리다가, 퇴근시간이 다가오면 허둥지둥 일을 마무리하고, 하루를 정리해 볼 틈도 없이 다음 날 똑같은 곳에 앉아 있는 모습, 바로 직장인들의 자화상이다.

이런 쳇바퀴 같은 일상 속에서 유일한 직장인의 낙은 커피 한 잔의 여유나, 복권에 당첨되는 꿈을 꾸는 것이다. 이쯤 되면 일은 일일 뿐, 자아성취와는 별로 관계가 없어 보이기까지 하다. 그런데 직장인에게 일이란 정말 벗어날 수 없는 지겨운 일상의 반복일 뿐일까.
사용자 삽입 이미지

저는~~오늘부터 일할~~인턴사원입니다♬

뮤지컬의 매력에 푹 빠지게 만들었다..

보고난 후 위의 멜로디가 머리속을 완전 떠나지 않는다.... ㅎㅎ

일에 쩌든 회사원들이 보면 딱 좋을꺼 같은 뮤지컬...
쉼 없이 웃고 즐기고 박수 치다보면 100분이 금방 지나가 버린다...

전혀 예상하지 않고 봤다가...
뜻밖의 웃음으로 기억 속에 많이 남을 것 같은 뮤지컬이다... ㅎ

XML 1.0 규격 한국어 번역문
확장성 작성 언어

번역에 관련한 주석는 이 색상으로 표시하여 원문 번역 내용과 구분하였다.
CSS 적용은 원본에 준하여 하되 한글 표현이 어색한 부분은 약간 조정하였다.
W3C에서 프레임을 허용하지 않아 프레임을 선택 할 수 있게 하였다.
번역문 제공자 : 트리오 웹 프랜드 Trio 홈페이지
다른 규격 번역문들
[HTML 4] [CSS 2] [CSS 1] [XHTML 1.0]
[ 프레임없게 보기 ] [ 프레임있게 보기 ] [ 바닥 ]
영문 XML 1.0 원문
번역문 시작

W3CREC-xml-19980210


Extensible Markup Language (XML) 1.0

1998년 2월 10일 W3C 추천안

이 버전:
영문 http://www.w3.org/TR/1998/REC-xml-19980210
영문 http://www.w3.org/TR/1998/REC-xml-19980210.xml
영문 http://www.w3.org/TR/1998/REC-xml-19980210.html
영문 http://www.w3.org/TR/1998/REC-xml-19980210.pdf
영문 http://www.w3.org/TR/1998/REC-xml-19980210.ps
최종 버전:
영문 http://www.w3.org/TR/REC-xml
이전 버전:
영문 http://www.w3.org/TR/PR-xml-971208
작성자들:
Tim Bray (Textuality and Netscape) mailto:tbray@textuality.com
Jean Paoli (Microsoft) 영문 mailto:jeanpa@microsoft.com
C. M. Sperberg-McQueen (University of Illinois at Chicago) 영문 mailto:cmsmcq@uic.edu

요약

확장성 작성 언어 (XML: Extensible Markup Language)는 이 문서에서 완전히 설명된 SGML의 하부세트(subset)이다. 그 목표는 특유의 SGML이 웹상에서 유지되고, 개정되고, 처리되어 현재 HTML에서 사용 가능한 방식으로 만드는 것이다. XML은 SGML 과 HTML에 다 적용하고 서로 통용 될 수 있도록 쉽게 설계되었다.


이 문서의 상태

이 문서는 W3C의 멤버와 관련자들의 검토를 거처, 임원회의 승인을 받은 상태이므로 인용하고 사용하는데 안전하다.
W3C의 추천안 형성 기능은 웹의 통용성을 돕도록 주의를 모으고, 그 결과를 널리 보급하는 것이다. 이렇게 함으로서 그 기능성과 상호 통용성을 강화한다.

이 문서는. 기존의 널리 사용되는 월드와이드웹(World Wide Web)에 사용하기 위한 국제 텍스트 처리 표준(Standard Generalized Markup Language, ISO 8879:1986(E)의 수정 보정)의 하부 설정에 의하여. 문법을 지정한다. 이는 W3C XML 활동에 의하여 생성되었으며, 상세한 내용은 영문 http://www.w3.org/XML에서 볼 수 있다. 현재의 W3C 추천안들과 다른 기술 문서들의 목록은 영문 http://www.w3.org/TR에서 볼 수 있다.

이규격은 용어 URI을 사용하는데, 이는 [Berners-Lee et al.]에 의하여 정의된 것이며, 진행되는 작업은 [IETF RFC1738][IETF RFC1808]에 갱신된다.

이규격의 알려진 오류들의 목록은 영문 http://www.w3.org/XML/xml-19980210-errata에서 볼 수 있다.

이 문서에서 오류들가 발견되면 영문 xml-editor@w3.org에 보고해주기 바란다.


확장성 작성 언어(XML: Extensible Markup Language) 1.0

목차

1. 소개
    1.1 기원과 목표
    1.2 용어
2. 문서들
    2.1 잘 형성된 XML 문서들
    2.2 글자들
    2.3 공통 문법적 구성
    2.4 글자 데이터와 코드(markup)
    2.5 코멘트(comment)
    2.6 처리지시(processing instruction)
    2.7 CDATA 항목
    2.8 서문(prolog)과 문서 타입 선언(document type declaration)
    2.9 독립 문서 선언(Standalone Document Declaration)
    2.10 공백의 처리
    2.11 줄 끝의 처리(End-of-Line Handling)
    2.12 언어의 인식
3. 논리적 구조
    3.1 시작태그, 종료태그와 빈 엘레멘트 태그
    3.2 엘레멘트 타입 선언
        3.2.1 엘레멘트 내용
        3.2.2 혼합 내용(content)
    3.3 애트리뷰트 목록 선언들
        3.3.1 애트리뷰트 타입
        3.3.2 애트리뷰트(attribute) 디폴트
        3.3.3 애트리뷰트 값 정상화(normalization)
    3.4 조건부 항목(conditional section)
4. 물리적 구조
    4.1 글자와 엔티티 참조
    4.2 엔티티(entity) 선언
        4.2.1 내부적 엔티티(entity)
        4.2.2 외부적 엔티티(entity)
    4.3 해석(parse)된 엔티티(entity)
        4.3.1 텍스트 선언
        4.3.2 잘 형성된 해석(parse)된 엔티티(entity)
        4.3.3 엔티티 안의 글자 엔코딩
    4.4 XML 처리자의 엔티티와 참조의 처리
        4.4.1 인식하지 못하는
        4.4.2 포함된
        4.4.3 포함된 If 유효성 검정
        4.4.4 금지된
        4.4.5 리터랄(literal)에 포함된
        4.4.6 알림(notify)
        4.4.7 통과(bypassed)
        4.4.8 PE(파라메터 엔티티)로 포함된
    4.5 내부적 엔티티(entity) 교체 텍스트의 형성
    4.6 사전에 정의된 엔티티(entity)
    4.7 주석(notation) 선언들
    4.8 문서 엔티티(entity)
5. 규격부합성
    5.1 유효성 검정하는, 유효성 검정 않는 처리자
    5.2 XML 처리자(processor)의 사용
6. 주석(notation)

Appendices

A. 참조
    A.1 지명적 참조
    A.2 다른 참조
B. 글자 분류
C. XML과 SGML (비지명적)
D. 엔티티와 글자 참조의 확장 (비지명적)
E. 판정적 내용 모델 (비지명적)
F. 글자 엔코딩의 자동감지 (비지명적)
G. W3C XML 작업구룹 (비지명적)


1. 소개

확장성 작성 언어 (XML: Extensible Markup Language)는 XML 문서라 불리우는 데이터 오브젝트(object)의 분류와 부분적으로 이를 처리하는 컴퓨터 프로그램의 활동을 기술한다. XML은 적용(application) 프로화일(profile) 혹은 제한된 SGML(Standard Generalized Markup Language [ISO 8879]) 양식이다. 구성상 XML 문서들은 SGML 문서들에 부합한다.

XML 문서들은 엔티티(entity)로 불리우는 저장된 단위들로 만들어 지며, 이는 해석(parse)된 또는 해석 안된 데이터를 가진다. 해석(parse)된 데이터는 글자들로 구성되며, 이들 일부는 글자 데이터를 형성하며, 일부는 코드(마크업: markup)을 형성한다. 코드(마크업)은 문서의 저장 배치와 논리적 구조를 기술(기재사항)을 엔코드(encode)한다. XML은 저장 배치와 논리적 구조에 제한요소를 주는 기능(mechanism)을 제공한다.

XML 처리자(processor)로 불리우는 소프트웨어 모듈(module)을 사용하여 XML 문서들을 읽고, 그 내용(content)과 구조에 접속을 제공한다. XML 처리자(processor)는 적용(application)이라 불리우는 다른 모듈(module)을 위하여 일(작업)하는 것으로 간주된다. 이 규격은, 어떻게 XML 데이터를 읽고 그 정보를 적용(application)에 제공하여야 하는가 하는, XML 처리자의 필요한 행동(behavior)을 기술한다.

1.1 기원과 목표

XML은 1996 W3C가 주관하는 XML 작업구룹(당초에는 SGML 점검회: Editorial Review Board)에 의하여 개발되었다. Sun Microsystems의 Jon Bosak가 회장이었고, 역시 W3C에 의하여 조직된, XML에 특히 관심이 있는 구룹(Special Interest Group: 과거 SGML 작업구룹으로 알려짐)이 참여하였다. 작업구룹의 구성원은 부록에 기재되어있다. Dan Connolly가 W3C의 접촉 담당으로 있었다.

XML에 대한 토론 목표는 다음과 같다:

  1. XML은 인터넷에서 막바로 사용 할 수 있어야 한다..
  2. XML은 넓은 종류의 적용(application)을 지원하여야 한다.
  3. XML은 SGML과 상호 통해야(사용가능) 한다.
  4. 이는 XML 문서들을 처리하는 프로그램을 쉽게 쓸 수 있어야 한다.
  5. XML의 선택적 성능(feature)들이 완전히 최소되던가 가능하면 없어야 한다.
  6. XML 문서들은 인간이 이해하기에 상당히 쉬워야 한다.
  7. XML 디자인을 빨리 할 수 있어야 한다.
  8. XML 디자인을은 양식에 따르고 함축적이야 한다.
  9. XML 문서들은 생성하기 쉬워야 한다.
  10. XML 작성(markup)에서의 간결성(terseness)은 별로 중요하지 않다.

이 규격과 관련된 표준들(Unicode, 글자들을 위한 ISO/IEC 10646, 언어의 인식 태그들을 위한 RFC 1766, 언어 이름 코들을 위 한 ISO 639, 국가 이름 코드를 위한 ISO 3166)은, 비표준인 XML 버전 1.0과 이를 처리하는 구성 컴퓨터 프로그램등에 필요한, 모든 정보를 제공한다.

XML 규격의 원문 버전은, 모든 텍스트와 법률적 경고에 합당하면, 배포를 자유롭게 할 수 있다.

1.2 용어

용어들은 이 규격 본체에서 XML 문서들을 기술하는데 사용되었다. 다음 목록에 정의된 용어들은 이 규격을 구성하는 정의들과 XML 처리자(processor)의 활동을 설명하는데 사용된다:

할 수 있다(may)
규격에 부합하는 문서들과 XML 처리자들은 허용되나, 설명된 바와 일치하지 않아도 된다.
하여야 한다(must)
규격에 부합하는 문서들과 XML 처리자들은 반드시 설명된 바와 일치 할 필요가 있으며, 그렇지 않으면 오류가 된다.
오류
이 규격의 규칙을 위반하는 것으로 그 결과는 정의되어 있지 않다. 규격에 부합하는 소프트웨어는 오류를 감지하고, 알리며, 회복하게 할 수 있다.
치명적 오류
규격에 부합하는 XML 처리자(processor)는 오류를 감지하고, 그 적용(application)에 알려야 한다. 치명적인 오류를 만난 다음, 처리자는 추가적인 오류들을 감지하기 위하여 계속 데이터를 처리 할 수 있고, 그와 같은 오류들을 적용에 알릴 수 있다. 오류들의 보정을 지원하기 위하여 처리자는 문서로 부터 처리되지 않은 데이터를, (글자 데이터와 코드마크업을 혼합하여) 적용이 사용 할 수 있는 것으로, 만들 수 있다. 그러나, 일단 치명적 오류가 감지되면, 처리자(processor)는 정상 처리를 계속하여서는 않된다. (말하자면, 정상적인 방법으로 글자 데이터와 문서의 논리적 구조에 대한 정보의 적용에게 전달을 중단하여야 한다.)
사용자의 선택으로
규격에 부합하는 소프트웨어는 문장 속의 내용에 따라 설명된 바와 같이, 할수 있거나, 하여야 한다. 만일 선택사항이 있으면, 이는 사용자가 설명된 작용을 가능하게 하거나, 중지 시킬 수 있는 수단을 제공한다.
유효성 검정 기준(제한사항)
모든 유효(valid) XML 문서들에 적용되는 규칙이다. 유효성 제한요소의 위배하는 것은 오류들이다; 사용자 선택으로 유효성 검정 XML 처리자(processor)에 의하여 알려 줘야한다.
잘 형성됨을 위한 필수사항
모든 잘 형성된 XML 문서들에 적용되는 규칙이다. 잘 형성됨을 위한 필수사항들을 위배하는 것은 치명적 오류들이다.
일치

(스트링이나 이름의 일치): 비교되는 두개의 스트링이나 이름들이 꼭 같아야 한다. ISO/IEC 10646 에서 여러 가능한 표현(예를 들어 사전 조합된 것과 베이스+구분적 양식의 글자들)의 글자들이 양쪽 스트링에서 같은 표현을 가질 때만 일치한다. 사용자 선택으로, 처리자(processor)는 이와 같은 글자들을 정규의 양식으로 정상화(일반화) 시킬 수 있다. 대소문자의 전환은 사전에 형성되지 않는다.

(문법에서 스트링과 코드(rule)의 일치): 그 작업으로 생성된 언어에 속하면, 스트링은 문법적 생성과 일치한다.

(내용(content)과 내용 모델(model)의 일치): "엘레멘트 유효성" 제한요소에 설명된 형태와 맞으면, 엘레멘트(element)는 그 선언과 일치한다.

규격부합성(compatibility)을 위하여
순전히 XML이 SGML과의 규격부합성을 유지함을 확실히 하기 위한, XML에 포함된 성능(feature)이다.
공통사용성(interoperability)을 위하여
기존 설치된 SGML 처리자(processor)들의 기초(ISO 8879로 폐기 된 WebSGML 적용 색인)에서, XML 문서들이 처리 될 가능성을 향상하기 위하여, 비 구속적으로, 포함한 추천사항이다.

2. 문서들

이규격에 정의된 바에 따라 잘 형성된 것이면, 데이터 오브젝트(object)는 하나의 XML 문서이다. 잘 형성된 XML 문서는 또한, 추가적인 제한요소들에 맞으면, 유효(valid) 할 수 있다.

각 XML 문서는 논리적 구조와 물리적 구조를 갖는다. 물리적으로, 문서는 엔티티(entity)라 불리우는 단위들로 이루어 진다. 한 엔티티(entity)는 다른 엔티티를 참조(refer) 할 수 있으며, 그 문서 안에 포함되게 된다. 한 문서는 최상위("root") 또는 문서 엔티티(entity)로 시작된다. 논리적으로, 문서는 선언, 엘레멘트(element), 코멘트(comment), 글자 참조와 처리지시(processing instruction)들로 이루어 지며, 이들 모두 그 문서의 명시적 코드(markup)로 지정된다. 논리적 구조와 물리적 구조는, "4.3.2 잘 형성되고 해석(parse)된 엔티티(entity)"에 설명된 바와 같이, 적정하게 네스트(nest)되어야 한다.

2.1 잘 형성된 XML 문서들

텍스트적 오브젝트(object)는 다음을 만족시키면 잘 형성된 XML 문서이다:

  1. 전체적으로, 라벨된(labeled) 문서 산물과 일치한다.
  2. 이규격에서 주어진 잘 형성됨을 위한 필수사항들에 부합한다.
  3. 문서에서 직접 혹은 간접적으로 참조된 각 해석(parse)된 엔티티잘 형성된 것이다.

문서(Document)
[1] document ::= prolog element Misc*

일치하는 문서(document) 산물(production)은 다음 사항을 내포(의미)한다:

  1. 하나 이상의 엘레멘트(element)를 포함한다.
  2. 최상위(root)라 불리우는 엘레멘트 또는 문서 엘레멘트 단 하나 만을 가지며, 이들 부분이 어떤 다른 엘레멘트의 내용(content) 안에 나타나지 않는다. 모든 다른 엘레멘트들에서, 또 다른 엘레멘트의 내용 속에 시작태그가 있으면, 종료태그도 같은 엘레멘트의 내용 속에 있다. 좀 더 간단히 말하면, 시작과 종료태그들로 구분되는 엘레멘트들은 서로 적정하게 네스트(nest) 되어있다.

이 결과로서, 문서에서 최상위가 아닌(non-root) 각 엘레멘트 'C'에게는, 'C'는 'P'의 내용 안에 있으나, 'P'의 내용에 있는 어떤 다른 엘레멘트의 내용이 않되록, 문서에서 다른 엘레멘트 'P'가 있다, 여기서 'P'는 C모체(parent)로 참조되고, 'C'는 'P'의 자식(child)으로 참조된다.

2.2 글자

해석(parse)된 엔티티(entity)는 텍스트를 갖는데, 이는 글자들의 연속으로, 코드(markup)나 글자 데이터가 될 수 있다. 한 글자는, ISO/IEC 10646 [ISO/IEC 10646]에 지정 된 바와 같이, 텍스트의 기초 단위이다. 올바른(legal) 글자들은 탭(tab), 리턴(enter), 줄공급(새줄 널기), 올바른 Unicode와 ISO/IEC 10646의 그래픽 글자들이다. [Unicode] 항목 6.8에서 정의된 "규격부합성(compatibility) 글자들"의 사용은 하지 않는 것이 좋다.

글자 범위(Character Range)
[2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* Unicode 글자(대용 블럭, FFFE, FFFF 제외). */

이진수(bit) 패턴으로 코드 포인트(code point) 글자 엔코딩하는 기구(mechanism)는 엔티티(entity)에 따라 서로 다르다. 모든 XML 처리자(processor)는 10646 의 UTF-8 와 UTF-16 엔코딩(encoding)을 수용하여야 한다. 이 두가지 중 어느 것이 사용되는가 신호 보내는 기구, 또는 다른 엔코딩을 가져다 쓰는 기구는 뒤 4.3.3 "엔티티의 글자 엔코딩"에서 다룬다.

2.3 공통(common) 문법적 구성

여기서는 문법에서 널리 사용되는 일부 기호(symbol)들을 정의한다.

S (공백: space)은 한개 이상의 공백글자(space: #x20), 리턴(enter), 줄공급(새줄 넣기), 탭(tab)들로 구성된다.

공백(White Space)
[3] S ::= (#x20 | #x9 | #xD | #xA)+

글자들은 편이상 글자, 숫자(digit)와 다른 글자들로 분류된다. 글자(letter)는 알파베트(alphabetic), 음절 기초글자(syllabic base)와 하나 이상의 조합된 글자, 표식글자(ideographic)들로 구성된다. 각 분류 내 특정 글자들의 완전한 정의는 B. "글자 분류"에 설명되었다.

이름(Name)은, 글자 또는 한개의 구둣점 글자(몇가지 중)로 시작되고, 글자나 숫자, 하이픈(-), 밑줄(_), 콜론(:) 또는 점(.)를 로 알려진 글자들을 계속적으로 갖는, 하나의 토큰(token)이다. 스트링 "xml" 혹은 (('X'|'x') ('M'|'m') ('L'|'l'))와 일치하는 다른 스트링으로 시작하는 이름은 이 규격과 향후 버전들에 표준화를 위하여 예약된 것이다.

주석: XML 이름 안의 콜론(:) 글자는 이름 자리를 실험하기 위해 예약된 것이다. 이는 향후 어느 싯점에서 표준화 될 것으로 기대되며, 그 싯점에서 문서에 실험 목적으로 사용하는 콜론을 갱신 될 수 있슴을 의미한다. (XML에서 이름자리(name-space) 기구(mechanism)에 이름자리 구분자(delimiter)로 콜론을 실제로 채택 할 것인가에 대한 보증은 없다.) 실제로 이는 제작자가 콜론을 이름자리 실험 이외에는 XML 이름에 사용하지 말아야 하고, XML 처리자(processor)는 콜론을 이름 글자로 받아들여야 한다는 것을 의미한다.

Nmtoken (이름 토큰)은 어떤 이름글자들의 혼합체이다.

이름과 토큰(Names and Tokens)
[4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender
[5] Name ::= (Letter | '_' | ':') (NameChar)*
[6] Names ::= Name (S Name)*
[7] Nmtoken ::= (NameChar)+
[8] Nmtokens ::= Nmtoken (S Nmtoken)*

리터랄(literal) 데이터는, 그 스트링의 구분자로 사용된 따옴표를 제외하고, 따옴표 속의 스트링이다. 리터랄 데이터는 내부적 엔티티(entity)의 내용(EntityValue), 애트리뷰트(attribute)의 값(AttValue)과 외부적 인식자(identifier: SystemLiteral)들을 지정하는데 사용된다. SystemLiteral은 코드(markup)의 처리(scanning) 없이 해석(parse) 될 수 있다는 점에 주의하라.

리터랄(Literals)
[9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"'
|  "'" ([^%&'] | PEReference | Reference)* "'"
[10] AttValue ::= '"' ([^<&"] | Reference)* '"'
|  "'" ([^<&'] | Reference)* "'"
[11] SystemLiteral ::= ('"' [^"]* '"') | ("'" [^']* "'")
[12] PubidLiteral ::= '"' PubidChar* '"' | "'" (PubidChar - "'")* "'"
[13] PubidChar ::= #x20 | #xD | #xA | [a-zA-Z0-9] | [-'()+,./:=?;!*#@$_%]

2.4 글자 데이터와 코드(markup)

텍스트글자 데이터와 코드(markup)의 혼합으로 구성되어 있다. 코드(markup)는 시작태그(tag), 종료태그, 빈 엘레멘트 태그, 엔티티(entity) 참조, 글자 참조, 코멘트, CDATA 항목 구분자(delimiter), 문서 타입 선언(document type declaration), 처리지시(processing instruction)들의 양식을 갖는다.

코드를 구성하니 않는 모든 텍스트는 문서의 글자 데이터이다.

코드(markup) 구분자로 사용거나, 또는 코멘트(comment), 처리지시(processing instruction) 또는 CDATA 항목 안에서 앰퍼샌드 글자(&)와 왼쪽 꺽쇄(<)가 그 리터랄(literal) 양식에 나타날 수 있다. 그들은 또한 내부적 엔티티(entity) 선언(declaration)의 리터랄 엔티티 값 안에서도 올바른(legal) 것이다. 항목 4.3.2 "잘 형성되고 해석(parse)된 엔티티"를 참조하라. 만일 다른 곳에서 필요하면 각각, 숫치(numeric) 글자 참조나 "&amp;" 스트링과 "&lt;"를 사용하여 에스케입(escaped) 되어야 한다. 오른쪽 꺽쇄(>)는 스트링 "&gt;"를 사용하여 표현 할 수 있으며, 내용 속의 스트링 "]]>" 안에 나타나고 CDATA 항목의 종료을 만들지 않으때는, 규격부합성을 위하여, 반드시 "&gt;"을 사용하여 에스케입(escaped) 되거나 글자 참조이어야 한다.

엘레멘트의 내용에서, 글자 데이터는, 어떤 코드(markup)의 시작구분자를 포함하지 않는, 글자들의 스트링이다. CDATA 항목에서, 글자 데이터는, CDATA 항목을 닫는 구분자(delimiter)인 "]]>"를 포함하지 않는, 글자들의 스트링이다.

애트리뷰트 값에 단일, 이중 따옴표들의 포함을 허용하려면, 단일 따옴 글자(')는 "&apos;"로, 이중 따옴 글자(")는 "&quot;"로 표현 할 수 있다.

글자 데이터(Character Data)
[14] CharData ::= [^<&]* - ([^<&]* ']]>' [^<&]*)

2.5 코멘트(comment)

문서에서 코멘트는 다른 코드(markup) 밖 어디에나 나타 날 수 있고, 또한, 문서 타입 선언(document type declaration) 안, 문법에 의하여 허용 된 장소에 나타 날 수 있다. 이들은 문서의 글자 데이터 부분이 아니다. XML 처리자(processor)는, 필요한 것은 아니지만, 적용(application)이 코멘트 텍스트를 읽게 할 수 있다. 규격부합성을 위하여, 스트링 "--"는 코멘트 속에 나타나지 말아야 한다.

코멘트(Comments)
[15] Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->'

코멘트의 예제:

<!-- <head> & <body>의 선언 -->

2.6 처리지시

처리지시(processing instruction: PI)는 문서들이 적용(application)을 위해 지시를 포함 할 수 있게 한다.

처리지시(Processing Instructions)
[16] PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char*)))? '?>'
[17] PITarget ::= Name - (('X' | 'x') ('M' | 'm') ('L' | 'l'))

PI는 문서의 글자 데이터 부분이 아니고, 적용(application)에 전달하여야 한다. PI는 지시가 어느 적용으로 향할 것인가를 지정하는데 사용하는 목표(PITarget)로 시작한다. 목표(target) 이름 "XML", "xml" 등은 표준화나 이규격의 향후 버전 위해 예약되었다. XML 주석(notation) 기구(mechanism)가 공식적인 PI 목표 선언에 사용 될 수 있다.

2.7 CDATA 항목

CDATA 항목은 글자 데이터가 나타 날 수 있는 어디에나 나타날 수 있고, 이들은, 그렇지 않으면 코드(markup)로 인식되는, 글자들을 포함하는 텍스트 블럭을 에스케입(escape) 하는데 사용된다. CDATA 항목은 스트링 "<![CDATA["로 시작되고 스트링 "]]>"로 끝난다.

CDATA 항목(CDATA Sections)
[18] CDSect ::= CDStart CData CDEnd
[19] CDStart ::= '<![CDATA['
[20] CData ::= (Char* - (Char* ']]>' Char*))
[21] CDEnd ::= ']]>'

CDATA 항목 안에서는, CDEnd 스트링 만이 코드(markup)로 인식된다. 그래서 외쪽 꺽쇄(<)와 앰퍼샌드(&)들이 그 리터랄(literal) 양식 안에 나타날 수 있다; 이들은 "&lt;"와 "&amp;"를 사용하여 에스케입(escape) 될 필요가 없으며 될 수도 없다. CDATA 항목들은 네스트(nest) 될 수 없다.

CDATA 항목의 예제, 여기서 "<greeting>"와 "</greeting>" 사이는 코드(markup)로 인식되지 않고 글자 데이터로 인식된다:

<![CDATA[<greeting>여러분 안녕하세요!</greeting>]]>

2.8 서문(prolog)과 문서 타입 선언(document type declaration)

XML 문서들은 사용된 XML의 버전을 지정하는 XML 선언으로 시작 할 수 있으며, 시작하여야 한다. 예를 들어, 아래는 완전한 XML 문서이고, 잘 형성된 것이지만 유효(valid)하지는 않다:

<?xml version="1.0"?>
<greeting>여러분 안녕하세요!</greeting>

이것도 같다:

<greeting>여러분 안녕하세요!</greeting>

버전 번호 "1.0"이 이규격의 이 버전의 규격부합성을 나타내기 위하여 사용되어야 한다; 이규격의 이 버전에 부합하지 않는 경우, 값 "1.0"을 사용한 문서는 오류이다. 향후 이규격의 버전들은 "1.0"과 다른 수치를 부여하고저 하는 것이 XML 작업구룹의 의도이지만, 향후 XML의 버전을 만들 것인가, 만들면 어떤 번호 붙이는 방식을 사용 할 것인가를 확인하고 있지는 않다. 향후 버전들에 대한 결정이 없으므로, 이 구성은 자동 버전 인식의 가능성을 허용하는 수단을 제공하며, 필요 할 것이다. 처리자(processor)는, 지원되지 않는 버전들로 라벨된 문서들을 받았을 때, 오류 신호를 보낼 수 있다.

XML 문서에서 코드(markup)의 기능(function)은, 그 저장과 논리적 구조, 연관된 애트리뷰트 값과 짝이되는 그 논리적 구조를 기술하기 위한 것이다. XML은 문서 타입 선언(document type declaration), 논리적 구조의 제한요소 정의와 사전에 정의된 저장 단위들의 사용을 지원하는 기구(mechanism)를 제공한다. 만일 연관된 문서 타입 선언를 갖고 있고, 문서가 그 안에 나타난 제한요소에 맞는다면, XML 문서는 유효(valid)하다.

문서 타입 선언은 문서 안에서 최초의 엘레멘트(element)보다 먼저 나와야 한다.

서문(Prolog)
[22] prolog ::= XMLDecl? Misc* (doctypedecl Misc*)?
[23] XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>'
[24] VersionInfo ::= S 'version' Eq (' VersionNum ' | " VersionNum ")
[25] Eq ::= S? '=' S?
[26] VersionNum ::= ([a-zA-Z0-9_.:] | '-')+
[27] Misc ::= Comment | PIS

XML 문서 타입 선언(document type declaration)는 문서의 분류를 위하여 문법을 제공하는 코드 선언들을 포함하거나 지명한다. 이 문법은 문서 타입 정의(DTD: document type definition)로 알려져 있다. 문서 타입 선언은 외부적 하부세트(외부적 엔티티의 특별한 종류)나 포함하는 코드(markup) 선언들를 지명 할 수 있고, 또는, 내부적 하부세트(subset) 안에 직접적으로 코드 선언들을 포함 할 수 있고, 둘 다 할 수도 있다. 문서의 DTD는 두가지 하부세트들이 같이 구성된다.

코드 선언은 is 엘레멘트 타입 선언, 애트리뷰트 목록 선언, 엔티티 선언, 또는 주석(notation) 선언이다. 이 선언들은,아래 설명된 바와 같은 잘 형성되고 유효성 제한요소에 따라 , 전부 혹은 일부를 파라메터(parameter) 엔티티 안에 포함 할 수 있다. 상세한 정보는 4. "물리적 구조"를 참조하라.

문서 타입 정의(Document Type Definition)
[28] doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? ('[' (markupdecl | PEReference | S)* ']' S?)? '>' [ VC: 최상위 엘레멘트 타입 ]
[29] markupdecl ::= elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment [ VC: 적정 선언/PE 네스팅 ]
[ WFC: 내부적 하부세트에서 PE ]

코드(markup) 선언들은 파라메터(parameter) 엔티티교체 텍스트 전부나 일부분으로 만들어 질 수 있다. 이규격의 나중 부분에 개별 비 터미널(nonterminal)들을 위한(elementdecl, AttlistDecl 등) 모든 파라메터 엔티티(entity)들이 포함다음에 선언들의 설명이 되었다.

유효성 제한요소: 최상위(root) 엘레멘트(element) 타입
문서 타입 선언의 이름(Name)이 최상위 엘레멘트의 엘레멘트 타입과 일치하여야 한다.

유효성 제한요소: 적정 선언/PE 네스팅
파라메터(parameter) 엔티티(entity) 교체 텍스트는 코드(markup) 선언들과 적정하게 네스팅(nest)되어야 한다. 말하자면, 코드(markup) 선언(위 markupdecl)의 첫 글자나 마지막 글자가 파라메터 엔티티 참조의 교체 텍스트 안에 포함되어 있으면, 둘 다 같은 교체 텍스트 안에 포함되어야 한다.

잘 형성됨을 위한 필수사항: 내부적 하부세트(subset) 안의 PE
내부적 DTD 하부세트에서, 파라메터 엔티티 참조는, 코드(markup) 선언들 안에는 나올 수 없고, 코드 선언들이 나올 수 있는 곳에 만 나올 수 있다. (이는 외부적 파라메터(parameter) 엔티티(entity) 안에서 또는 외부적 하부세트에 나오는 참조에 대해서는 적용되지 않는다.)

내부적 하부세트와 마찬가지로, DTD 안에서 참조하는 외부적 하부세트와 외부적 파라메터 엔티티는, 비 터미널 기호(symbol) markupdecl에 의하여 허용되는 타입의, 공백으로 분린된 또는 파라메터 엔티티 참조의, 일련의 완전한 코드선언들로 구성되어야 한다. 그러나 외부적 하부세트나 외부적 파라메터 엔티티의 내용(content) 부분들이, 조건적 항목 구성을 사용하여, 조건에 따라 무시 될 수 있다; 이는 내부적 하부세트에서는 허용되지 않는다.

외부적 하부세트(External Subset)
[30] extSubset ::= TextDecl? 영문 extSubsetDecl
[31] extSubsetDecl ::= ( markupdecl | conditionalSect | PEReference | S )*

외부적 하부세트(subset)와 외부적 파라메터(parameter) 엔티티(entity)는 또한 그 안의 내부적 하부세트에서와 다른데, 파라메터 엔티티 참조는 코드(markup) 선언들 사이에서 뿐 아니라, 속에서도 허용된다.

문서 타입 선언(document type declaration)을 갖는 XML 문서 예제:

<?xml version="1.0"?>
<!DOCTYPE greeting SYSTEM "hello.dtd">
<greeting>여러분 안녕하세요!</greeting>

시스템 인식자(identifier) "hello.dtd"는 문서를 위한 DTD의 URI를 제공한다.

그 선언들은 예제와 같이 지역적으로 주어 질 수 있다:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE greeting [
  <!ELEMENT greeting (#PCDATA)>
]>
<greeting>여러분 안녕하세요!</greeting>

외부적과 내부적 하부세트(subset)들이 다 사용되면, 내부적 하부세트가 외부적 하부세트보다 먼저 나온 것으로 간주된다. 내부적 하부세트에 있는 엔티티(entity)와 애트리뷰트 목록 선언들이 외부적 하부세트에 있는 것에 우선하여 작용하는 효과를 갖는다.

2.9 독립 문서 선언(Standalone Document Declaration)

코드(markup) 선언들은 XML 처리자(processor)로부터 적용(application)에 전달함에 따라 문서에 내용에 영향을 줄 수 있다; 예를 들면 애트리뷰트(attribute) 디폴트들과 엔티티(entity) 선언들이다. 독립 문서 선언은 XML 선언의 부분으로 나타날 수 있으며, 문서 엔티티에 외부적으로 이와 같은 선언들이 있는가 없는가의 신호를 준다.

독립 문서 선언(Standalone Document Declaration)
[32] SDDecl ::= S 'standalone' Eq (("'" ('yes' | 'no') "'") | ('"' ('yes' | 'no') '"')) [ VC: 독립 문서 선언 ]

독립 문서 선언(Standalone Document Declaration)에서, 값 "yes"는, XML 처리자(processor)로부터 적용(application)에 전달되는 정보에 영향을 주는, 문서 엔티티(DTD에 외부적 하부세트이나, 내부적 하부세트들로 부터 참조되는 외부적 파라메터 엔티티)에 외부적인 코드(markup) 선언이 없슴을 나타낸다. 값 "no"는 이와 같은 외부적 코드 선언들이 있거나, 있을 수 있슴을 나타낸다. 독립 문서 선언은 단지 외부적 선언들의 존재를, 이들 엔티티들이 내부적으로 선언되었으면 문서에서 외부적 엔티티로 참조함의 존재를 나타내고, 그 독립성의 상태는 변하지 않음에 주의하라.

만일 외부적 코드 선언들이 없으면, 독립 문서 선언은 아무 의미를 갖지 않는다. 외부적 코드 선언들이 있으나 독립 문서 선언이 없으면, 그 값은 "no"로 간주된다.

standalone="no"을 같고 있는 XML 문서는 변환 기능(algorithmically)으로 독립 문서로 변환 될 수 있으며, 이는 일부 네트워크 배달(전달) 적용에 바람직 할 수 있다

유효성 제한요소: 독립 문서 선언(Standalone Document Declaration)
독립 문서 선언이 값 "no"를 가지면 외부적 코드(markup) 선언들은 다음의 선언들을 포함한다:

  • 이 애트리뷰트들이 적용되는 엘레멘트가 문서 안에 나타나는데, 이 애트리뷰트의 값들이 지정되지 않았으면, 디폴트 값들을 갖는 애트리뷰트들, 또는
  • 문서 안에서 이들 엔티티(entity)들을 참조하면, amp, lt, gt, apos, quot 이외의 엔티티, 또는
  • 정상화(normalization) 될 값들을 갖는 애트리뷰트들, 여기서, 정상화(normalization)의 결과 바뀔 값을 갖는 애트리뷰트(attribute)가 문서에 나타난다, 또는
  • 이들 타입들의 인스탄스(instance) 안에 공백이 직접적으로 나타나면, 엘레멘트 내용을 갖는 엘레멘트 타입들.

독립 문서 선언(Standalone Document Declaration)을 갖는 XML 선언의 예제:

<?xml version="1.0" standalone='yes'?>

2.10 공백의 처리

XML 문서들을 작성하는데, 자주 "공백"(이규격에서 비터미널 S로 표기한 공간, 탭, 빈줄)을 사용하기 위하여 변환하여, 코드를 훨신 읽기 쉽게한다. 이와 같은 공백은 전형적으로 이 문서의 버전에 포함하기 위하여 의도된 것은 아니다. 이와는 달리 "상당한" 공백이 유지되어야 하는 경우가 많이 있는데 시 문구나 소스코드가 그 예이다.

XML 처리자는 항상 문서 안의 비 코드(markup)의 모든 글자들을 적용(application)에 전달하여야 한다. 유효성 검정 XML 처리자는 또한 적용에게, 엘레멘트 내용 안에 나타나는 공백을 구성하는 이 글자들에 대한, 정보를 제공하여야 한다.

공백이 적용에서 그대로 유지되도록, 엘레멘트에 의도하는 신호를 보내기 위하여, 'xml:space'로 이름 지워진 특별한 애트리뷰트가 엘레멘트(element)에 첨부 될 수 있다. 유효한(valid) 문서들에서, 이 애트리뷰트는 다른 것과 마찬가지로, 이것이 사용되면, 선언되어야 한다. 선언되면, 값들은 디폴트("default")와 유지("preserve") 만이 가능한 숫자주기(enumerated) 타입이 되어야 한다. 예를 들어:

    <!ATTLIST poem   xml:space (default|preserve) 'preserve'>

값 "default"는 적용(application)의 이 엘레멘트 디폴트 공백처리 과정이면 만족스럽다는 신호를 보내고; 값 "preserve"는 모든 공백을 그대로 유지하겠다는 의도를 적용에 알려준다. 이 선언된 의도는 내용 안 지정된 그 엘레멘트의 모든 엘레멘트들에, 다른 'xml:space' 애트리뷰트의 인스탄스로 덮어 씌우기 되지 않는 한, 적용 할 것으로 간주된다.

문서의 최상위(root) 엘레멘트는, 이 애트리뷰트의 값이 제공되거나, 애트리뷰트가 디폴트 값으로 선언되지 않는 한, 적용의 공백 처리에 의도가 없다는 신호를 받은 것으로 간주한다.

2.11 줄 끝의 처리(End-of-Line Handling)

XML로 해석(parse)된 엔티티는 자주 컴퓨터 화일들로 저장된며, 편집의 편이성을 위하여, 줄(line)들로 만들어 진다. 이 줄들은 전형적으로 리턴(carriage-return: '#xD')과 줄공급(line-feed: '#xA') 글자들의 조합으로 분리된다.

적용(applications)의 임무를 단순화 하기 위하여, 내부적으로 해석(parse)된 엔티티의 외부적으로 해석된 엔티티나 리터랄(literal) 엔티티 값이 리터랄 연속 두 글자 "#xD#xA" 또는 단일 글자 "#xD"이면 언제나, XML 처리자(processor)는 적용(application)에게 단일 글자 "#xA"를 전달하여야 한다. (이 활동은, 해석 전에 정상화에 의하여 모든 줄바꿈을 입력(input)에서 "#xA"로 편리하게 생성 할 수 있다.)

2.12 언어의 인식

문서 처리에서, 그 문서가 작성된 내용의 자연 혹은 공식 언어를 지정하는 것이 자주 유용하다. 'xml:lang'로 이름지워 진 특별 애트리뷰트가 문서에 삽입되어 내용에 사용된 언어를 지정 할 수 있고, XML 문서의 어떤 엘레멘트 애트리뷰트 값을 지정 할 수 있다. 유효한(valid) 문서들에서, 이 애트리뷰트(attribute)는 다른 것과 마찬가지로, 사용되면 선언되어야 한다. 애트리뷰트의 값들은 [IETF RFC 1766], "언어를 인식하기 위한 태그들"에 정의 된 바와 같은 언어 인식자(identifier)들이다:

언어의 인식(Language Identification)
[33] LanguageID ::= Langcode ('-' Subcode)*
[34] Langcode ::= ISO639CodeIanaCodeUserCode
[35] ISO639Code ::= ([a-z] | [A-Z]) ([a-z] | [A-Z])
[36] IanaCode ::= ('i' | 'I') '-' ([a-z] | [A-Z])+
[37] UserCode ::= ('x' | 'X') '-' ([a-z] | [A-Z])+
[38] Subcode ::= ([a-z] | [A-Z])+

Langcode는 아래 것 중의 하나가 될 수 있다:

  • [ISO 639]의 "언어들의 이름을 나타내는 코드"에 정의된 두글자 언어 코드
  • '인터넷 할당 번호 당국'[IANA](Internet Assigned Numbers Authority)에 등옥된 언어 인식자(identifier); 이는 "i-"(또는 "I-")의 접두어로 시작된다.
  • 사용자에 의하여, 혹은 개인적 사용에서 당사자끼리 합의하여 지정된 언어 인식자(identifier); 이는 IANA에 향후 표준화되거나 등록될 이름과 마찰하지 않도록 확실히 하기 위하여 접두어 "x-" 또는 "X-" 로 시작되어야 한다.

어떤수의 하부코드(Subcode) 부분(segment)들이 있을 수 있다; 만일 하부코드가 있고 두개의 글자로 구성되어 있으면, 이는 [ISO 3166]의 "국가들의 이름을 표현하는 코드들"에서 왔을 것이며, 만일 처음 하부코드가 두개보다 많은 글자로 구성되어 있으면, Langcode가 접두어 "x-" 혹은 "X-"로 시작하지 않는 한, 이는 IANA에 등록된 언어 하부코드 일 것이다.

습관적으로 언어코드는 소문자로, 국가코드는 (있으면) 대문자로 주어진다. 이 값들은 XML 문서에서 다른 이름들과는 다르게 대소문자를 구별하지 않는다는 점에 주의하라.

예를 들어:

<p xml:lang="en">The quick brown fox jumps over the lazy dog.</p>
<p xml:lang="en-GB">What colour is it?</p>
<p xml:lang="en-US">What color is it?</p>
<sp who="Faust" desc='leise' xml:lang="de">
  <l>Habe nun, ach! Philosophie,</l>
  <l>Juristerei, und Medizin</l>
  <l>und leider auch Theologie</l>
  <l>durchaus studiert mit hei?m Bem?'n.</l>
  </sp>

의도적으로 'xml:lang'로 선언된 것은, 그 내용 안에서 다른 엘레멘트에 'xml:lang' 인스탄스(instance)를 사용하여 덮어씌움을 하지 않는 한, 그 정의 된 엘레멘트(element)의 모든 애트리뷰트(attribute)들과 내용(content)에 적용하는 것으로 간주된다.

'xml:lang'의 간단한 선언은 아래 양식을 갖는다;

xml:lang  NMTOKEN  #IMPLIED

그러나, 적정하다면, 특정 디폴트 값들이 주어 질 수도 있다. 영국 학생들에게 불어 시들의 모음에서, 설명과 주석은 영어로 할 때, 'xml:lang' 애트리뷰트는 다음과 같이 선언 될 수 있다:

    <!ATTLIST poem   xml:lang NMTOKEN 'fr'>
    <!ATTLIST gloss  xml:lang NMTOKEN 'en'>
    <!ATTLIST note   xml:lang NMTOKEN 'en'>


3. 논리적 구조

XML 문서는 하나 이상의 엘레멘트(element)들 갖고, 그 범위는 시작태그종료태그, 또는 빈(empty) 엘레멘트에서는 빈 엘레멘트 태그(tag)로 구분된다. 각 엘레멘트는 타입(type)을 갖고, 때로는 "특유 인식자"(GI: Generic Identifier)로 불리우는 이름으로 인식되고, 일련의 애트리뷰트 규격들을 가질 수 있다. 각 애트리뷰트(attribute)의 규격은 이름(name)과 을 갖는다.

엘레멘트(Element)
[39] element ::= EmptyElemTag
| STag content ETag [ WFC: 엘레멘트 타입일치 ]
[ VC: 엘레멘트 유효 ]

이규격은, 그 이름이 이규격의 표준화나 향후 버전들을 위한 예약어와 일치하는 (('X'|'x')('M'|'m')('L'|'l'))로 시작하는 것을 제외하고는, 엘레멘트 타입들과 애트리뷰트들의 문법(semantic), 사용, 또는 (문법 이외의) 이름을 제한하지 않는다.

잘 형성됨을 위한 필수사항: 엘레멘트 타입일치(Element Type Match)
엘레멘트(element)의 종료태그 안의 Name(이름)은 시작태그 안의 엘레멘트 타입과 일치하여야 한다.

유효성 제한요소: 엘레멘트 유효(Element Valid)
이름(Name)이 그 엘레멘트 타입에 일치하는 elementdecl와 일치하는 선언이 있으면, 엘레멘트가 유효(valid)하며, 다음 중 하나에 해당한다:

  1. 선언이 'EMPTY'(빈것)와 일치하고, 엘레멘트가 내용(content)을 갖고 있지 않다.
  2. 선언이 자식(child)들과 일치하고, 자식 엘레멘트들의 연속이, 내용 모델(model) 안의 일반적 지정(expression)으로 생성된 언어에 소속되어 있고, 자식 엘레멘트들의 각 짝 사이에 선택적 공백(글자가 비 터미널 S와 일치하는)을 가지고 있다.
  3. 선언이 Mixed(혼합)와 일치하고, 그 내용이 글자 데이터와 그 타입이 내용 모델(model)의 이름과 일치하는 자식 엘레멘트들로 구성되었다.
  4. 선언이 ANY와 일치하고, 어떤 자식(child) 엘레멘트의 타입이 선언되었다.

3.1 시작태그, 종료태그, 빈 엘레멘트 태그

빈것이 아닌 각 XML 엘레멘트(element)의 시작은 시작태그로 표시되어 있다.

시작태그(Start-tag)
[40] STag ::= '<' Name (S Attribute)* S? '>' [ WFC: 유일 애트리뷰트 규격 ]
[41] Attribute ::= Name Eq AttValue [ VC: 애트리뷰트 값 타입 ]
[ WFC: 외부적 엔티티 참조 안함 ]
[ WFC: 애트리뷰트 값에 < 없슴 ]

시작태그와 종료태그 안에 이름(Name)이 엘레멘트(element)의 타입(type)을 지정한다. Name - AttValue의 짝들은 그 엘레멘트의 애트리뷰트 규격으로, 각 짝의 Name애트리뷰트 이름애트리뷰트 값으로 AttValue(' 또는 " 구분자들 사이의 텍스트)의 내용으로 참조된다.

잘 형성됨을 위한 필수사항: 유일 애트리뷰트 규격(Unique Att Spec)
같은 시작태그 또는 빈 엘레멘트 태그 안에서 같은 애트리뷰트(attribute) 이름이 나와서는 않된다.

유효성 제한요소: 애트리뷰트 값 타입(Attribute Value Type)
애트리뷰트는 선언되어 있어야 한다; 그 값은 이를 위한 선언된 타입이어야 한다. (애트리뷰트 타입은 3.3 "애트리뷰트 목록 선언"을 참조하라.)

잘 형성됨을 위한 필수사항: 외부적 엔티티 참조가 없어야 함(No External Entity References)
애트리뷰트 값들은 외부적 엔티티에 대한 직접적 혹은 간접적 엔티티 참조를 포함 할 수 없다.

잘 형성됨을 위한 필수사항: 애트리뷰트 값에 '<'가 없어야 함
애트리뷰트 값에서 직접적 혹은 간접적으로 참조된 엔티티(entity)의 교체 텍스트("&lt;" 이외의)는 '<'를 포함 할 수 없다.

시작태그의 예제:

<termdef id="dt-dog" term="dog">

시작태그로 시작된 각 엘레멘트(element)는, 시작태그에서 주어진 엘레멘트 타입을 복사한 이름을 포함하는, 종료태그로 표시하여야 한다:

종료태그(End-tag)
[42] ETag ::= '</' Name S? '>'

종료태그의 예제:

</termdef>

시작태그와 종료태그 사이의 텍스트를 엘레멘트의 내용이라 한다:

엘레멘트의 내용(Content of Elements)
[43] content ::= (element | CharData | Reference | CDSect | PI | Comment)*

만일 엘레멘트가 비어(empty) 있으면, 이는 시작태그가 열리자 마자 종료태그가 온 것이 거나 빈 엘레멘트 태그이다. 빈 엘레멘트 태그는 특수한 양식을 갖는다:

빈 엘레멘트 태그(Tags for Empty Elements)
[44] EmptyElemTag ::= '<' Name (S Attribute)* S? '/>' [ WFC: Unique Att Spec ]

빈 엘레멘트 태그는 내용(content)이 없는 어느 엘레멘트에도 사용 될 수 있으며, 'EMPTY' 키워드(keyword)로 선언된다. 공통사용성(interoperability)을 위하여, 빈 엘레멘트 태그가 사용되어야 하며, 'EMPTY'로 선언된 엘레멘트들에서 만 사용 될 수 있다.

빈(empty) 엘레멘트의 예제:

<IMG align="left"
 src="http://www.w3.org/Icons/WWW/w3c_home" />
<br></br>
<br/>

3.2 엘레멘트 타입 선언

XML 문서의 엘레멘트(element) 구조는, 유효성 검정(validation) 목적으로, 엘레멘트 타입과 애트리뷰트 목록 선언들을 사용하여 제한을 줄 수 있다. 엘레멘트 타입 선언은 엘레멘트(element)의 내용(content)에 제한을 준다.

엘레멘트 타입 선언은 자주 어떤 엘레멘트 타입들이 엘레멘트의 자식(child)들에 나타날 수 있는가의 제한을 준다. 사용자의 선택으로, 선언이 되지 않은 엘레멘트 타입의 선언이 나타나면, XML 처리자(processor)는 경고를 발생 시킬 수 있는데, 이것은 오류가 아니다.

엘레멘트 타입 선언은 다음과 같은 양식을 갖는다:

엘레멘트 타입 선언(Element Type Declaration)
[45] elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>' [ VC: 유일한 엘레멘트 타입 선언 ]
[46] contentspec ::= 'EMPTY' | 'ANY' | Mixed | children

여기서 이름(Name)은 선언되는 엘레멘트의 타입을 준다.

유효성 제한요소: 유일한 엘레멘트 타입 선언
같은 엘레멘트(element) 타입이 다시 선언 될 수 없다.

엘레멘트 타입 선언의 예제:

<!ELEMENT br EMPTY>
<!ELEMENT p (#PCDATA|emph)* >
<!ELEMENT %name.para; %content.para; >
<!ELEMENT container ANY>

3.2.1 엘레멘트 내용

엘레멘트(element) 타입(type)은, 그 타입의 엘레멘트가 자식(child) 엘레멘트들(글자 데이터는 안되고) 만을 포함하여야 하며, 선택적으로 공백(글자가 비 터미날 S와 일치)으로 분리되면, 엘레멘트 내용(content)을 갖는다. 이 경우, 내용 모델(model), 그 자식 엘레멘트들의 허용된 타입들을 관할하는 단순 문법과, 그들이 나타 날 수 있는 순서의 제한사항을 포함한다. 문법은 내용 조각(cp: content particle)에 만들며, 이는 이름, 내용 조각의 선택 목록, 또는 내용 조각(particle)들의 순서 목록들로 구성된다:

엘레멘트 내용 모델(Element-content Model)
[47] children ::= (choice | seq) ('?' | '*' | '+')?
[48] cp ::= (Name | choice | seq) ('?' | '*' | '+')?
[49] choice ::= '(' S? cp ( S? '|' S? cp )* S? ')' [ VC: 적정 구룹/PE 네스팅 ]
[50] seq ::= '(' S? cp ( S? ',' S? cp )* S? ')' [ VC: 적정 구룹/PE 네스팅 ]

여기서 각 이름(Name)은 자식(child)에 나타날 수 있는 엘레멘트(element)의 타입이다. 선택 목록의 어떤 내용(content) 조각(particle)도 엘레멘트 내용 안의 문법에서 선택 목록이 나타나는 위치에 나타날 수 있다; 일련의 목록 안에서 나오는 내용 조각들은 그 목록 안에서 주어진 순서로 그 엘레멘트 내용에 각각 나타나야 한다. 이름이나 목록 뒤의 선택적 글자가 목록 안에서 엘레멘트나 내용 조각들이 한번 이상(+), 한번도 없거나 여러번(*), 한번 나오던가 안 나오던가(?)하는 것을 결정한다. 이와 같은 오퍼레이터(operator)가 없으면, 엘레멘트나 내용 조각이 꼭 한번 나와야 한다는 것을 의미한다. 이 문법과 의미는 이규격의 제작에 사용된 것과 동일하다.

내용(content) 모델(model)을 통하여 경로(path)를 추적 할 수 있고, 순서에 따르고, 선택하였고, 반복적 오퍼레이터(operator)이고, 내용의 각 엘레멘트가 내용(content) 모델(model)의 엘레멘트 타입에 대하여 일치 할 때에 한해서, 엘레멘트의 내용은 내용 모델과 일치한다 규격부합성(compatibility)을 위하여, 문서의 엘레멘트가 내용 모델의 엘레멘트(element) 타입과 한번 이상 일치하면 오류이다. 자세한 정보는 E. "판정적 내용 모델"을 참조하라.

유효성 제한요소: 적정 구룹/PE 네스팅(Proper Group/PE Nesting)
파라메터(parameter) 엔티티(entity) 교체 텍스트는 괄호 속에 들어간 구룹들로 적정하게 네스팅(nest)되어야 한다. 다시 말하면, 'choice', 'seq' 또는 'Mixed' 구성 안의 열림이나 닫힘 괄호들이 파라메터(parameter) 엔티티 교체 텍스트 안에 포함되면, 둘 다 같은 교체 텍스트 안에 포함되어야 한다. 공통사용성(interoperability)을 위하여, 만일 파라메터(parameter) 엔티티(entity) 참조가 'choice', 'seq' 또는 'Mixed' 안에 나타나면, 그 교체 텍스트는 빈것이 아니어야 하고, 교체 텍스트의 처음이나 마지막 공백글자가 아닌 글자가 ('|' 혹은 ',')의 연결자(connector)가 아니어야 한다.

엘레멘트 내용 모델의 예제:

<!ELEMENT spec (front, body, back?)>
<!ELEMENT div1 (head, (p | list | note)*, div2*)>
<!ELEMENT dictionary-body (%div.mix; | %dict.mix;)*>

3.2.2 혼합 내용(mixed content)

그 타입의 엘레멘트가 어떤 글자 데이터를 가질 수 있고, 선택적으로 자식(child) 엘레멘트(element)들에 분산되었으면, 그 엘레멘트 타입(type)은 혼합 내용을 갖는다. 이 경우, 자식 엘레멘트들의 타입은 제한 될 수 있으나, 그들의 순서나 나타나는 갯수는 제한 될 수 없다:

혼합 내용 선언(Mixed-content Declaration)
[51] Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*'
| '(' S? '#PCDATA' S? ')' [ VC: 적정 구룹/PE 네스팅 ]
[ VC: 타입 중복없슴 ]

여기서 이름(Name)들이 자식(child)들로 나타날 수 있는 엘레멘트 타입을 제공한다.

유효성 제한요소: 타입 중복없슴(No Duplicate Types)
같은 이름이 단일 혼합 내용 선언 안에서 나타나지 말아야 한다.

혼합 내용 선언 예제:

<!ELEMENT p (#PCDATA|a|ul|b|i|em)*>
<!ELEMENT p (#PCDATA | %font; | %phrase; | %special; | %form;)* >
<!ELEMENT b (#PCDATA)>

3.3 애트리뷰트 목록 선언

엘레멘트(element)의 이름과 값의 짝들을 연관시키기 위하여 애트리뷰트(attribute)들이 사용된다. 애트리뷰트 규격들은 시작태그빈 엘레멘트 태그들 안에 만 나타날 수 있다; 그래서, 이들을 알기 위 한 것은 3.1 "시작태그, 종료태그, 빈 엘레멘트 태그"에 기술되었다. 애트리뷰트 목록 선언들은 다음의 경우에 사용 될 수 있다:

  • 주어진 엘레멘트(element) 타입의 애트리뷰트들의 설정을 지정하기 위하여
  • 애트리뷰트(attribute)에 타입 제한요소를 설정하기 위하여
  • 애트리뷰트에 디폴트 값들을 제공하기 위하여

애트리뷰트 목록 선언들은 주어진 엘레멘트(element) 타입에서 관련된 각 애트리뷰트(attribute)의 이름, 데이터 타입과 디폴트 값(있으면)들을 지정한다:

애트리뷰트 목록 선언(Attribute-list Declaration)
[52] AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>'
[53] AttDef ::= S Name S AttType S DefaultDecl

AttlistDecl 코드(rule) 안의 이름(Name)은 엘레멘트(element)의 타입(type)이다. 사용자의 선택으로, 선언이 되지 않은 엘레멘트 타입의 선언이 나타나면, XML 처리자(processor)는 경고를 발생 시킬 수 있는데, 이것은 오류가 아니다. AttDef 코드(rule) 안의 이름(Name)은 애트리뷰트(attribute)의 이름이다.

주어진 엘레멘트(element) 타입에 하나 이상의 AttlistDecl이 있으면, 제공된 모든 내용들은 통합된다(merge). 주어진 엘레멘트 타입의 같은 애트리뷰트가 하나 이상 정의되었으면, 먼저 선언이 작용되고 나중 선언들은 무시된다. 공통사용성을 위하여, DTD 작성자는 주어진 엘레멘트 타입에 많아도 한개의 애트리뷰트 목록 선언을, 주어진 애트리뷰트 이름에 많아도 한개의 애트리뷰트 정의를, 그리고 각 애트리뷰트 목록 선언 안에 적어도 한개의 애트리뷰트 정의를 선택 할 수 있다. 공통사용성(interoperability)을 위하여, 주어진 엘레멘트 타입에 하나 이상의 애트리뷰트 목록 선언되었거나, 주어진 애트리뷰트에 하나 이상의 애트리뷰트 정의가 되었으면, XML 처리자(processor)는 사용자 선택으로 경고를 발생시킬 수 있고 이것은 오류가 아니다.

3.3.1 애트리뷰트 타입

XML 애트리뷰트 타입들에는 세가지가 있는다: 스트링 타입, 토큰화된(tokenized) 타입들의 세트, 그리고 번호붙인(enumerated) 타입들. 스트링 타입은 그 값으로 어떠한 리터랄(literal) 스트링도 가질수 있고; 토큰화된(tokenized) 타입들은 위에서 다룬 바와 같이 여러 내용과 문법적 제한요소를 가질 수 있다:

애트리뷰트 타입(Attribute Types)
[54] AttType ::= StringType | TokenizedType | EnumeratedType
[55] StringType ::= 'CDATA'
[56] TokenizedType ::= 'ID' [ VC: ID ]
[ VC: 엘레멘트 타입 당 한 ID ]
[ VC: ID 애트리뷰트디폴트 ]
| 'IDREF' [ VC: IDREF ]
| 'IDREFS' [ VC: IDREF ]
| 'ENTITY' [ VC: 엔티티 이름 ]
| 'ENTITIES' [ VC: 엔티티 이름 ]
| 'NMTOKEN' [ VC: 이름 토큰 ]
| 'NMTOKENS' [ VC: 이름 토큰 ]

유효성 제한요소: ID
타입 ID의 값은 이름(Name)과 일치하여야 한다. 이름은 XML 문서에서 이 타입의 값으로 한번 이상 나타나지 말하야 한다; 말하자면, ID 값들은 그것을 갖는 엘레멘트(element)들을 인식(지정) 할 수 있도록 유일하여야 한다.

유효성 제한요소: 엘레멘트 타입당 한 ID(One ID per Element Type)
지정된 한 ID 애트리뷰트가 엘레멘트 타입에서 한번 이상 나올 수 없다.

유효성 제한요소: ID 애트리뷰트 디폴트(ID Attribute Default)
ID 애트리뷰트(attribute)는 #IMPLIED 혹은 #REQUIRED의 디폴트 선언이 있어야 한다.

유효성 제한요소: ID 참조(IDREF)
타입 IDREF의 값들이 생성된 이름(Name)과 일치하여야 하며, 타입 IDREFS의 값들이 이름과 일치하여야 한다; 각 Name은 그 XML 문서 안의 일부 엘레멘트의 ID 애트리뷰트에 일치하여야 하는데 이는 다시 말해 IDREF 값들이 일부 ID 애트리뷰트 값과 일치하여야 한다.

유효성 제한요소: 엔티티 이름(Entity Name)
타입 ENTITY의 값들은 생성된 Name과 일치하여야 하며, 타입 ENTITIES의 값들은 Names과 일치하여야 하며; 각 NameDTD 안의 선언된 한 해석(parse) 안된 엔티티의 이름과 일치하여야 한다.

유효성 제한요소: 이름 토큰(Name Token)
타입 NMTOKEN의 값들은 일치 the 생성된 Nmtoken과 일치하여야 하고; 타입 NMTOKENS의 값들은 Nmtokens과 일치하여야 한다.

번호붙여진 애트리뷰트들은 선언이 제공하는 값들의 목록 중 하나를 가질 수 있어야 한다. 두가지 종류의 번호붙여진(Enumerated) 타입들이 있다:

번호붙여진 애트리뷰트 타입(Enumerated Attribute Types)
[57] EnumeratedType ::= NotationType | Enumeration
[58] NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')' [ VC: 주석 애트리뷰트 ]
[59] Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')' [ VC: Enumeration ]

NOTATION 애트리뷰트는 시스템 과/또는 공통(public) 인식자(identifier)들과 관련하여 DTD에 선언되고, 그 애트리뷰트가 첨부된 엘레멘트를 해석(interpreting)하는데 사용되는, 주석(notation)을 인식(identify)한다.

유효성 제한요소: 주석 애트리뷰트(Notation Attributes)
이 타입의 값들은 선언에 포함된 하나의 주석(notation) 이름과 일치하여야 한다; 선언의 모든 주석(notation) 이름은 선언된 것이어야 한다.

유효성 제한요소: Enumeration
이 타입의 값들은 선언에 포함된 하나의 Nmtoken 토큰(token)과 일치하여야 한다.

공통사용성(interoperability)을 위하여, 단일 엘레멘트의 번호붙인(enumerated) 애트리뷰트 타입에서 같은 Nmtoken은 나타나지 말아야 한다.

3.3.2 애트리뷰트 디폴트

애트리뷰트 선언은 애트리뷰트(attribute)가 있을 필요성이 있는가, 아니면, 문서에 선언된 애트리뷰트가 없으면 어떻게 XML 처리자(processor)가 반응하여야 하는가의 정보를 제공한다.

애트리뷰트 디폴트(Attribute Defaults)
[60] DefaultDecl ::= '#REQUIRED' | '#IMPLIED'
| (('#FIXED' S)? AttValue) [ VC: 필요한 애트리뷰트 ]
[ VC: 유효한 애트리뷰트 디폴트 ]
[ WFC: 애트리뷰트 값에 '<' 없슴 ]
[ VC: 고정된 애트리뷰트 디폴트 ]

애트리뷰트(attribute) 선언에서, #REQUIRED는 애트리뷰트가 항상 제공되어야 하고, #IMPLIED는 디폴트 값이 없는 것을 의미한다. 만일 선언이 #REQUIRED#IMPLIED가 아니면, AttValue 값은 선언된 디폴트 값을 갖는다; #FIXED 키워드(keyword)는 애트리뷰트가 항상 디폴트 값을 가져야 한다는 것을 기술한다. 디폴트 값이 선언되었으면, XML 처리자(processor)가 생략된 애트리뷰트를 만났을 때, 디폴트 값이 선언된 애트리뷰트가 있는 것 처럼 행동한다.

유효성 제한요소: 필요한 애트리뷰트(Required Attribute)
디폴트 선언이 키워드 #REQUIRED이면, 애트리뷰트는 애트리뷰트 목록 선언 안 그 타입의 모든 엘레멘트에 지정되어야 한다.

유효성 제한요소: 유효한 애트리뷰트 디폴트(Attribute Default Legal)
선언된 디폴트 값은 선언된 애트리뷰트 타입의 제한요소을 만족시켜야 한다.

유효성 제한요소: 고정된 애트리뷰트 디폴트(Fixed Attribute Default)
만일 애트리뷰트가 #FIXED 키워드로 선언된 디폴트 값을 가지고 있으면, 애트리뷰트의 인스탄스(instance)는 그 디폴트 값과 일치하여야 한다.

애트리뷰트 목록 선언 예제:

<!ATTLIST termdef
          id      ID      #REQUIRED
          name    CDATA   #IMPLIED>
<!ATTLIST list
          type    (bullets|ordered|glossary)  "ordered">
<!ATTLIST form
          method  CDATA   #FIXED "POST">

3.3.3 애트리뷰트 값의 정상화(normalization)

애트리뷰트(attribute) 값이 적용(application)에 전달되거나 유효성이 점검되기 전에, XML 처리자(processor)는 아래와 같이 정상화 하여야 한다:

  • 참조된 글자를 애트리뷰트 값에 첨부 함으로서 글자 참조가 처리된다.
  • 반복적으로 엔티티(entity)의 교체 텍스트를 가공 함으로서 엔티티 참조가 처리된다.
  • 외부적으로 해석(parse)된 엔티티의 부분, 또는 내부적으로 해석된 엔티티의 리터랄(literal) 엔티티 값인 "#xD#xA" 연속에 단일 '#x20' 만이 추가된다는 것 제외하고는, 공백 글자(#x20, #xD, #xA, #x9)는 정상화 된(normalized) 값에 '#x20'를 추가 함으로서 처리된다.
  • 다른 글자들은 그것에 정상화된 값이 첨부 됨으로서 처리된다

만일 그 선언된 값이 CDATA 가 아니면, XML 처리자(processor)는, 맨 앞과 뒤의 공백(#x20) 글자들을 제거하고, 연속 공백(#x20) 글자들을 단일 공백(#x20) 글자로 교체하는, 추가적인 애트리뷰트 값의 정상화 과정을 거쳐야 한다.

선언이 없는 모든 애트리뷰트들은 유효성을 검정 않는 해석자(parser)에 의하여 CDATA가 선언된 것 처럼 취급 되어야 한다.

3.4 조건부 항목

조건부 항목(conditional section)은, 그들을 다루는 키워드(keyword)에 기초한 DTD의 논리적 구조에 포함되거나 제외된, 문서 타입 선언 외부적 하부세트의 부분들이다.

조건부 항목(Conditional Section)
[61] conditionalSect ::= includeSect | ignoreSect
[62] includeSect ::= '<![' S? 'INCLUDE' S? '[' extSubsetDecl ']]>'
[63] ignoreSect ::= '<![' S? 'IGNORE' S? '[' ignoreSectContents* ']]>'
[64] ignoreSectContents ::= Ignore ('<![' ignoreSectContents ']]>' Ignore)*
[65] Ignore ::= Char* - (Char* ('<![' | ']]>') Char*)

내부적과 외부적 DTD 하부세트(subset)들과 마찬가지로, 조건부 항목(conditional section)은 한개 혹은 그 이상의 완전한 선언, 코멘트, 처리지시(processing instruction) 또는 네스트(nest) 된 조건부 항목들, 공백과 혼합들을 포함 할 수 있다.

만일 조건부 항목의 키워드(keyword)가 INCLUDE이면, 조건부 항목의 내용(content)은 DTD의 부분이다. 조건부 항목의 키워드가 IGNORE이면, 조건부 항목의 내용은 논리적으로 DTD의 부분이 아니다. 올바른 해석(parsing)을 위하여, 조건부 항목들의 네스트를 알아내고, (무시된) 조건부 항목의 감지된 가장 밖의 끝을 확인하기 위하여, 무시된 조건부 항목의 내용들 까지도 읽어야 한다는 점에 주의하라. 만일 조건부 항목이 키워드 INCLUDE가, 키워드 IGNORE를 갖는 더 큰 조건부 항목 안에 나타나면, 외부와 내부 조건부 항목들이 둘 다 무시된다.

만일 조건부 항목의 키워드가 파라메터(parameter) 엔티티를 참조이면, 처리자(processor)가 그 조건부 항목(conditional section)을 포함 할 것인가 무시 할 것인가를 결정하기 전에, 파라메터 엔티티는 그 내용(content)으로 대체되어야 한다.

예제:

<!ENTITY % draft 'INCLUDE' >
<!ENTITY % final 'IGNORE' >
 
<![%draft;[
<!ELEMENT book (comments*, title, body, supplements?)>
]]>
<![%final;[
<!ELEMENT book (title, body, supplements?)>
]]>


4. 물리적 구조

XML 문서는 하나 혹은 그 이상의 저장(storage) 단위들로 구성 될 수 있으며, 이것들을 엔티티(entity)라 부른다; 이들은 모두 내용(content)을 가지며, 모두(문서 엔티티(아래 참조)와 외부적 DTD 하부세트를 제외) 이름(name)으로 인식된다. 각 XML 문서는 문서 엔티티라 불리우는 하나의 엔티티를 가지며, 이는 XML 처리자(processor)의 시작점으로 작용하고, 전체 문서를 포함 할 수 있다.

엔티티는 해석(parse)된 것이거나 해석 안된 것이 될 수 있다. 해석(parse)된 엔티티의 내용(content)들은 그 교체 텍스트로 참조된다; 이 텍스트는 그 문서의 일부로 간주된다.

해석(parse) 안된 엔티티는, 그 내용이 텍스트가 될 수 있거나 될 수 없는 자원(resource)이며, 만일 텍스트이면, XML이 될 수 없다. 각 해석 안된 엔티티는 하나의 관련된 주석(notation)을 가지며, 이름으로 인식된다. XML 처리자(processor)가 적용(application)이 사용 할 수 있는 엔티티와 주석(notation)의 인식자(identifier)들을 만드는 필요성 말고는, XML은 해석 안된 엔티티의 내용에 제한요소를 주지 않는다.

해석된 엔티티들은 엔티티 참조를 사용하여 이름으로 불러지고(invoked); 해석 안된 엔티티는 이름, 주어진 값 ENTITY 혹은 ENTITIES 애트리뷰트들로 불러진다.

일반(general) 엔티티는 문서 내용(content) 안에서 사용되는 엔티티이다. 이규격에서, 일반 엔티티는 때때로, 모호성이 없을 때, 단순히 엔티티(entity)로 참조된다. 파라메터 엔티티들은 DTD 안에서 사용되는 해석(parse)된 엔티티이다. 이들 엔티티의 두 타입들은 다른 참조 양식들을 사용하며, 다른 문맥들로 인식된다. 더더욱, 이들은 다른 이름자리(namespace)들을 차지한다; 같은 이름의 파라메터 엔티티와 일반 엔티티는 서로 다른 엔티티들이다.

4.1 글자와 엔티티 참조

글자 참조는 ISO/IEC 10646 글자 세트의 특정 글자를 참조한다. 예를 들면 입력장치들에서 직접적으로 사용 할 수 없는 글자를 참조하는 것이다.

글자 참조(Character Reference)
[66] CharRef ::= '&#' [0-9]+ ';'
| '&#x' [0-9a-fA-F]+ ';' [ WFC: 올바른(legal) 글자 ]

잘 형성됨을 위한 필수사항: 올바른(legal) 글자
글자 참조를 사용하여 참조된 글자들은 Char 생성물과 일치하여야 한다.

만일 글자 참조가 "&#x"으로 시작하고, 숫자(digit)나 글자(letter)들, 그리고 ;로 종료되면, ISO/IEC 10646의 글자들 코드 포인트의 16진수 표현이 된다. 만일 "&#" 만으로 시작되고, 숫자, 그리고 ;로 종료되면, 글자들 코드 포인트의 10진수 표현이 된다.

엔티티(entity) 참조는 이름 붙여진(named) 엔티티의 내용을 참조한다. 해석(parse)된 일반 엔티티의 참조는 앰퍼샌드(&)와 쎄미콜론 (;)을 구분자(delimiter)로 사용한다. 파라메터(parameter) 엔티티 참조는 백분율 기호 (%)와 쎄미콜론 (;)을 구분자(delimiter)로 사용한다.

엔티티 참조(Entity Reference)
[67] reference ::= EntityRef | CharRef
[68] EntityRef ::= '&' Name ';' [ WFC: 선언된 엔티티 ]
[ VC: 선언된 엔티티 ]
[ WFC: 해석 된 엔티티 ]
[ WFC: 반복 없슴 ]
[69] PEReference ::= '%' Name ';' [ VC: 선언된 엔티티 ]
[ WFC: 반복 없슴 ]
[ WFC: DTD 안에 ]

잘 형성됨을 위한 필수사항: 선언된 엔티티(Entity Declared)
DTD가 없는 문서에서, 파라메터(parameter) 엔티티 참조가 없는 내부적 DTD 하부세트(subset) 하나 만을 갖는 문서, 또는 "standalone='yes'" 이고, Name이 엔티티 참조에 주어진 문서는, 엔티티(entity) 선언의 것과 일치하여야 하나, 잘 형성된 문서들에서 다음 엔티티들은 선언 할 필요가 없는 예외 사항이다: amp, lt, gt, apos, quot. 파라메터 엔티티 선언은 그의 어떤 참조보다 먼저되어야 한다. 유사하게, 일반 엔티티(entity) 선언은, 애트리뷰트 목록 선언의 디폴트 값을 참조보다 먼저되어야 한다. 만일 엔티티들이 외부적 하부세트(subset) 또는 외부적 파라메터 엔티티에 선언되었으면, 유효성 검정을 하지 않는 처리자(processor)는 그의 선언들을 읽고 처리하지 않는다는 점에 유의하라; 이런 문서들에서, 엔티티가 선언되어야 한다는 규칙은 standalone='yes'인 경우에 만 해당하는 잘 형성되기 위한 필수사항이다

유효성 제한요소: 선언된 엔티티(Entity Declared)
외부적 하부세트 또는 외부적 파라메터 엔티티에 "standalone='no'"를 갖는 문서에서, 엔티티 참조에 주어진 Name엔티티 선언의 것과 일치하여야 한다. 공통사용성(interoperability)을 위하여, 유효한(valid) 문서들은, 4.6 "사전에 정의된 엔티티"에 지정된 양식으로, 엔티티 amp, lt, gt, apos, quot가 선언하여야 한다. 파라메터(parameter) 엔티티의 선언은 그의 어떤 참조보다 먼저되어야 한다. 유사하게, 일반 엔티티 선언은, 애트리뷰트 목록 선언의 디폴트 값을 참조보다 먼저되어야 한다.

잘 형성됨을 위한 필수사항: 해석된 엔티티(Parsed Entity)
해석된 엔티티 참조는 해석 안된 엔티티(entity) 이름을 포함해서는 않된다. 해석(parse) 안된 엔티티는, 선언된 애트리뷰트 값이 타입 ENTITY 또는 ENTITIES 일 경우에 만, 참조 될 수 있다

잘 형성됨을 위한 필수사항: 반복 없슴(No Recursion)
해석(parse)된 엔티티는 직접적이건 간접적이건 반복된 자체의 참조를 포함하지 말아야 한다.

잘 형성됨을 위한 필수사항: DTD 안에(In DTD)
파라메터(parameter) 엔티티(entity) 참조는 DTD 안에 만 나타날 수 있다.

글자와 엔티티 참조 예제:

Type <key>less-than</key> (&#x3C;) to save options.
This document was prepared on &docdate; and
is classified &security-level;.

파라메터(parameter) 엔티티(entity) 참조 예제:

<!-- declare the parameter entity "ISOLat2"... -->
<!ENTITY % ISOLat2
         SYSTEM "http://www.xml.com/iso/isolat2-xml.entities" >
<!-- ... now reference it. -->
%ISOLat2;

4.2 엔티티 선언

엔티티(entity)들은 다음과 같이 선언된다:

엔티티 선언(Entity Declaration)
[70] EntityDecl ::= GEDecl | PEDecl
[71] GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>'
[72] PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>'
[73] EntityDef ::= EntityValue | (ExternalID NDataDecl?)
[74] PEDef ::= EntityValue | ExternalID

Name엔티티 참조에 있는 엔티티, 또는, 해석(parse) 안된 엔티티(entity)의 경우, ENTITY 혹은 ENTITIES 애트리뷰트 값을 인식(identify)한다. 만일 같은 엔티티가 한번 이상 선언되었으면, 먼저 만난 선언이 적용된다; 사용자 선택으로, XML 처리자(processor)는 만일 엔티티(entity) 여러번 선언되었으면 경고를 발생시킬 수 있다.

4.2.1 내부적 엔티티

만일 엔티티 정의가 EntityValue이면, 그 정의된 엔티티(entity)를 내부적 엔티티라 부른다. 별도의 물리적 저장 오브젝트(object)가 있지 않고, 엔티티 내용(content)은 선언에 주어진다. 일부 리터랄(literal) 엔티티 값의 엔티티와 글자 참조 처리는 올바른 교체 텍스트를 만드는데 필요 할 수 있다는 점에 유의하라: 4.5 "내부적 엔티티 교체 텍스트의 구성"을 참고하라.

하나의 내부적 엔티티는 해석(parse)된 엔티티(entity)이다.

내부적 엔티티 선언 예제:

<!ENTITY Pub-Status "This is a pre-release of the
 specificaion.">

4.2.2 외부적 엔티티

만일 엔티티(entity)가 내부적이 아니면, 아래와 같이 선언된 외부적 엔티티이다:

외부적 엔티티 선언(External Entity Declaration)
[75] ExternalID ::= 'SYSTEM' S SystemLiteral
| 'PUBLIC' S PubidLiteral S SystemLiteral
[76] NDataDecl ::= S 'NDATA' S Name [ VC: 선언된 주석 ]

만일 NDataDecl가 있으면, 이는 일반 해석 안된 엔티티이며; 아니면 해석(parse)된 엔티티이다.

유효성 제한요소: 선언된 주석(Notation Declared)
Name은 주석(notation)의 선언된 이름과 일치하여야 한다.

SystemLiteral은 그 엔티티(entity)의 시스템 인식자(identifier)라 불리운다. 이는 하나의 URI이며, 엔티티(entity)를 불러오는데 사용 될 수 있다. URI 함께 자주 사용되는 #와 부위(fragment) 인식자(identifier)는 공식적으로는 URI 자체의 일부가 아니라는 점에 유의하라; XML 처리자(processor)는, 시스템 인식자의 일부로 부위(fragment) 인식자가 있으면, 오류의 신호를 발생시킬 수 있다. 이규격 범위 밖의(예를 들어 특정 DTD에 의해 정의된 특별 XML 엘레멘트 타입, 혹은, 특정 적용 규격에 의하여 정의된 처리지시) 정보가 따로 제공되지 않는 한, 상대적 URI들은 엔티티 선언에 나타난 자원 위치에 상대적이다. 그래서 한 URI는 문서 엔티티에, 외부적 DTD 하부세트(subset)에 포함된 엔티티에, 또는 다른 외부적 파라메터 엔티티에 상대적이 될 수 있다.

XML 처리자(processor)는 URI에 있는 비ASCII 글자를, 하나 혹은 그이상의 바이트(byte)로 UTF-8 글자로 표현함으로서, 그리고는 이들 URI 에스케입하는 기구(mechanism: 말하자면, 각 바이트를 16진수 주석인 %HH로 변환하여)로 바이트 에스케입(escape)하여, 취급하여야 한다.

시스템 인식자(identifier)에 추가적으로, 외부적 인식자에 공통(public) 인식자를 포함 할 수 있다. 엔티티의 내용 읽음을 시도하는 XML 처리자(processor)는 대체 URI의 생성을 시도하기 위하여 공통(public) 인식자를 사용 할 수 있다. 만일 그 처리자가 그렇게 할 수 없으면, 시스템 리터랄(system literal)에서 지정한 URI를 사용하여야 한다. 일치를 시도하기 전에, 모든 공통 인식자의 공백 스트링은, 단일 공백 글자(#x20)로, 그리고 맨 앞과 맨 뒤의 공백은 제거하여, 정상화(normalized)되어야 한다.

외부적 엔티티 선언 예제:

<!ENTITY open-hatch
         SYSTEM "http://www.textuality.com/boilerplate/OpenHatch.xml">
<!ENTITY open-hatch
         PUBLIC "-//Textuality//TEXT Standard open-hatch boilerplate//EN"
         "http://www.textuality.com/boilerplate/OpenHatch.xml">
<!ENTITY hatch-pic
         SYSTEM "../grafix/OpenHatch.gif"
         NDATA gif >

4.3 해석(parse)된 엔티티(entity)

4.3.1 텍스트 선언

외부적 해석(parse)된 엔티티(entity)는 각각 텍스트 선언으로 시작 될 수 있다.

텍스트 선언(Text Declaration)
[77] TextDecl ::= '<?xml' VersionInfo? EncodingDecl S? '?>'

텍스트 선언은 해석된 엔티티를 참조하는 것이 아니라 리터랄(literal)로 제공되어야 한다. 텍스트 선언은 외부적 해석(parse)된 엔티티의 시작 부분 이외의 위치에는 나올 수 없다.

4.3.2 잘 형성된 해석(parse)된 엔티티(entity)

문서 엔티티는, 이것이 라벨된(labeled) document의 생성물과 일치하면, 잘 형성된 것이다. 외부적 일반적(general) 해석(parse)된 엔티티는, 이것이 라벨된 extParsedEnt의 생성물과 일치하면, 잘 형성된 것이 된다. 외부적 파라메터(parameter) 엔티티는, 이것이 라벨된 extPE의 생성물과 일치하면, 잘 형성된 것이 된다.

잘 형성된 외부적 해석된 엔티티(Well-Formed External Parsed Entity)
[78] extParsedEnt ::= TextDecl? content
[79] extPE ::= TextDecl? extSubsetDecl

내부적 일반적(general) 해석(parse)된 엔티티(entity)는, 그의 교체 텍스트가 라벨된 내용(content)의 생성물과 일치하면, 잘 형성된 것이 된다. 모든 내부적 파라메터(parameter) 엔티티는 정의에 의해 잘 형성된 것이 된다.

엔티티가 잘 형성되었다는 것은 XML 문서의 논리적, 물리적 구조가 적정하게 네스트(nest)되었다는 것이다; 시작태그, 종료태그, 빈 엘레멘트 태그, 엘레멘트(element), 코멘트(comment), 처리지시(processing instruction), 글자 참조, 또는 엔티티 참조가 한 엔티티에서 시작되고 다른 것에서 종료 될 수 없다는 것이다.

4.3.3 엔티티 안의 글자 엔코딩

XML 문서의 각 외부적 해석(parse)된 엔티티는 그 글자들을 위하여 다른 엔코딩(encoding) 사용 할 수 있다. 모든 XML 처리자(processor)들은 UTF-8 나 UTF-16의 엔티티(entity)를 읽을 수 있어야 한다.

UTF-16으로 엔코드(encode)된 엔티티는, ISO/IEC 10646 부록 E 와 Unicode 부록 B 너비없고-줄바꿈없는-공백(ZERO WIDTH NO-BREAK SPACE 글자, #xFEFF)에 설명된 바이트 순서 표시(Byte Order Mark)로 시작하여야 한다. 이는 XML 문서의 코드(markup)나 글자 데이터의 부분이 아니라 하나의 엔코딩 서명(signature: 표시)이다, XML 처리자(processor)는 이 글자을 UTF-8 와 UTF-16로 엔코드된 문서들을 서로 다르게 사용 할 수 있어야 한다.

XML 처리자는 UTF-8과 UTF-16로 엔코딩된 엔티티를 읽을 수 있는 것이 요구되지만, 전 세계를 통해 다른 엔코딩들이 알려져 있고, XML 처리자(processor)들이 그 엔티티들을 읽는 것은 바람직 할 수 있다. UTF-8 이나 UTF-16 이외의 엔코딩으로 저장된 해석(parse)된 엔티티(entity)는 엔코딩 선언을 포함하는 텍스트 선언으로 시작되어야 한다:

엔코딩 선언(Encoding Declaration)
[80] EncodingDecl ::= S 'encoding' Eq ('"' EncName '"' |  "'" EncName "'" )
[81] EncName ::= [A-Za-z] ([A-Za-z0-9._] | '-')* /* Latin 글자들 만 갖는 엔코딩 이름*/

문서 엔티티에서, 엔코딩(encoding) 선언은 XML 선언의 한 부분이다. EncName는 사용된 엔코딩 이름이다.

엔코딩 선언에서, 값들 "UTF-8", "UTF-16", "ISO-10646-UCS-2", "ISO-10646-UCS-4"는 Unicode / ISO/IEC 10646의 여러 엔코딩들과 변형들에 사용되어야 하고, 값들 "ISO-8859-1", "ISO-8859-2", ... "ISO-8859-9"는 ISO 8859의 부분에 사용되어야 하며, 값들 "ISO-2022-JP", "Shift_JIS", "EUC-JP"는 JIS X-0208-1997의 양식으로 엔코드된 것들에 사용되어야 한다. XML 처리자(processor)들은 다른 엔코딩(encoding)들을 인식 할 수 있다; [IANA](Internet Assigned Numbers Authority: 인터넷 할당 번호 당국)의 등록된(charset로) 글자 엔코딩들과 목록으로 된 다른 엔코딩들을, 그들의 등록된 이름을 사용하는데 참조 할 것을 권한다. 이들 등록된 이름은 대소문자 구별하지 않고 정의되고, 그래서 처리자(processor)들은 그에 일치하기 원하면 대소문자 구별하지 않는 방식으로 해야 한다 점에 유의하라.

외부적 전달 프로토골(protocol: 예 HTTP 또는 MIME)에 의하여 정보가 제공되지 않은 상태에서, (1) 선언 안의 이름 이외의 엔코딩으로 XML 처리자에게 제시되는 엔코딩 선언을 포함하는 엔티티, (2) 외부적 엔티티의 시작부분이 아니 곳에 엔코딩 선언이 나타나는 것, 또는 (3) UTF-8 이외의 엔코딩을 사용하기 위하여 Byte Order Mark 도 아니고 엔코딩(encoding) 선언도 아닌 것으로 시작되는 엔티티는 오류이다.
ASCII는 UTF-8의 하부세트(subset)이므로 보통의 ASCII 엔티티는 엄격하게 엔코딩(encoding) 선언을 필요로 하지 않음을 명심하라.

XML 처리자가 처리 할 수 없는 엔코딩이 있는 엔티티를 만나면 이것은 치명적 오류이다.

엔코딩 선언 예제:

<?xml encoding='UTF-8'?>
<?xml encoding='EUC-JP'?>

4.4 XML 처리자의 엔티티와 참조의 처리

아래 테이블은 글자 참조, 엔티티 참조, 해석 안된 엔티티가 나타나면 조치와 각 경우 XML 처리자가 취해야 할 행위등의 문맥들을 요약한 것이다. 가장 왼쪽 컬럼의 라벨은 알려진 문맥을 기술하였다:

내용(content) 참조
엘레멘트의 시작태그종료태그 전 어디에서나 참조; 비 터미날 content에 해당.
애트리뷰트 값의 참조
시작태그 안의 애트리뷰트(attribute) 값, 또는 애트리뷰트 선언의 디폴트 값을 참조; 비 터미날 AttValue에 해당.
애트리뷰트 값으로 나타남
참조가 아니라, Name으로 타입이 ENTITY로 선언된 애트리뷰트(attribute)의 값으로 또는 타입이 ENTITIES로 선언된 애트리뷰트(attribute)의 값으로 하나의 공간으로 분리된 토큰(token)들로 나타나는 것.
엔티티(entity) 값 참조
파라메터(parameter) 또는 엔티티(entity)의 선언에서 내부적 엔티티의 리터랄(literal) 엔티티 값으로 참조; 비 터미날(nonterminal) EntityValue에 해당.
DTD 참조
내부적 또는 DTD의 외부적 하부세트(subset)들에서 참조, 그러나 EntityValue 또는 AttValue의 외부.
엔티티 타입 글자
파라메터(parameter) 내부적 General 외부적 해석된 General 해석(parse) 안된
내용 참조 인식 못함 포함 포함된 if 유효성 검정 금지된 포함
애트리뷰트 값 참조 인식 못함 리터랄에 포함 금지된 금지된 포함
애트리뷰트 값으로 나타남 인식 못함 금지된 금지된 알림 인식 못함
엔티티 값 참조 리터랄에 포함 통과 통과 금지된 포함
DTD 참조 PE로 포함된 금지된 금지된 금지된 금지된

4.4.1 인식 못함

DTD 외부에서, % 글자는 특별한 의미를 갖지 못한다; 그래서, DTD에서 참조하는 파라메터(parameter) 엔티티(entity)를 content 안에 코드(markup)로 인식하지 못한다. 이와 유사하게, 적정하게 선언된 애트리뷰트(attribute)의 값으로 나타나지 않는 한, 해석(parse) 안된 엔티티 이름들이 인식되지 못한다.

4.4.2 포함

엔티티(entity)가, 참조가 인식된 장소에서 그 문서의 일부분인 것 처럼 참조 그 자리에서, 그 교체 텍스트가 읽혀지고 처리되면, 포함된다. 교체 텍스트는 글자 데이터와 (파라메터 엔티티 제외) 코드(markup)를 포함 할 수 있다. 여기서 코드는, 사용된 엔티티(entity)들의 교체 텍스트가 코드 구분자들(엔티티 amp, lt, gt, apos, quot)로 에스케입(escape)하는 경우를 제외하고는 항상 데이터로 처리된다는 것 이외에는, 보통 방식으로 인식되어야 한다. (스트링 "AT&amp;T;"는 "AT&T;"로 확장되고, 나머지 앰퍼샌드는 엔티티-참조 구분자로 인식하지 못한다.) 한 글자 참조는 지정된 글자가 그 참조 자체의 자리에서 처리되면 포함된 것이다.

4.4.3 포함된 If 유효성 검정

XML 처리자(processor)가 해석(parse)된 엔티티(entity) 참조를 인식하면, 그 문서의 유효성 검정(validate)을 위하여, 처리자는 그 교체 텍스트를 포함(include)하여야 한다. 만일 엔티티가 외부적이고, 처리자가 XML 문서 유효성 검정을 시도하지 않으면, 그 처리자(processor)는, 필요사항은 아니지만, 엔티티(entity)의 교체 텍스트를 포함 할 수 있다. 만일 유효성 검정하지 않는 해석자(parser)가 교체 텍스트를 포함하지 않으면, 적용(application)에게 인식된 엔티티를 알려 주어야 하지만, 읽지는 않는다.

이 규칙은, 자동 포함이 SGML에 의하여 제공되고, XML 엔티티 기구(mechanism)가 원천적으로 편집의 모듈성을 지원하기 위하여 설계되고, 다른 적용들(구체적인 예로 문서 브라우징)에 적당하지 않을 수 있다는, 인식을 기초로 한 것이다. 예를 들어, 외부적 해석(parse)된 엔티티 참조를 만나면, 브라우저들은, 엔티티의 존재를 보이고, 읽어, 요구에 의해서 만 디스플레이하는, 선택을 할 수 있다.

4.4.4 금지된

아래는 금지된 사항들이고 치명적(fatal) 오류들을 구성한다:

  • 해석(parse) 안된 엔티티를 참조하는 것.
  • EntityValueAttValue 이외의 곳에서 DTD에서 글자 또는 일반(general) 엔티티(entity) 참조하는 것.
  • 애트리뷰트 값에서 외부적 엔티티(entity)를 참조하는 것.

4.4.5 리터랄(literal)에 포함된

애트리뷰트 값에 엔티티 참조가 나타나거나, 리터랄(literal) 엔티티 값에 파라메터(parameter) 엔티티 참조가 나타나면, 교체 텍스트 안의 단일 또는 이중 따옴표 글자는 항상 정상 데이터 글자로 처리되고, 리터랄을 종료시키지 않는다는 것을 제외하고는, 그 교체 텍스트가 그 문서의 부분인 것 처럼 인식된 참조의 위치에서 처리된다:

잘 형성된 예제:

<!ENTITY % YN '"Yes"' >
<!ENTITY WhatHeSaid "He said &YN;" >

그렇지 않은 예제:

<!ENTITY EndAttr "27'" >
<element attribute='a-&EndAttr;>

4.4.6 알림(notify)

해석(parse) 안된 엔티티(entity)의 이름이 선언된 타입 ENTITY 또는 ENTITIES의 애트리뷰트(attribute) 값에 토큰(token)으로 나타나면, 유효성 검정 처리자(processor)는 시스템(system) 적용(application)과 공통(public: 있으면) 인식자(identifier)들에게, 엔티티와 그 관련된 주석(notation)을 알려 주어야 한다.

4.4.7 통과(bypassed)

엔티티 선언에서 EntityValue에 일반 엔티티 참조가 나타나면, 그대로 놔두고 통과한다.

4.4.8 PE로 포함된

외부적 해석(parse)된 엔티티에서와 마찬가지로, 파라메터(parameter) 엔티티(entity)는 포함된 if 유효성 검정을 할 때 만 필요하다. DTD에서 파라메터 엔티티 참조가 인식되고, 포함되면, 그 교체 텍스트는 앞과 뒤에 각 한개의 공백(#x20) 글자를 첨부하여 확장된다; 그 의도는 파라메터(parameter) 엔티티(entity)의 교체 텍스트에 DTD 문법적 정수 수치 토큰을 방지하기 위한 것이다.

4.5 내부적 엔티티 교체(replacement) 텍스트의 형성

내부적 엔티티의 처리를 다루는데, 두가지 양식의 엔티티 값들을 구별하는 것이 유용하다. 리터랄(literal) 엔티티 값은 엔티티(entity) 선언에서 실제적으로 따옴표 안의 스트링으로 비 터미날 EntityValue에 해당한다. 교체 텍스트는, 글자 참조와 파라메터 엔티티 참조 교체(replacement) 이후에는, 엔티티의 내용이다.

내부적 엔티티 선언에서(EntityValue) 주어진 리터랄(literal) 엔티티 값은 글자, 파라메터(parameter) 엔티티와 일반 엔티티 참조들을 포함 할 수 있다. 이와같은 참조는 완전히 리터랄 엔티티(entity) 값 안에 포함되어야 한다. 위에 설명된 바와 같은 포함된 실제적인 교체 텍스트는 참조된 파라메터(parameter) 엔티티의 교체 텍스트를 포함하여야 하며, 참조된 글자 리터랄 엔티티 값 안에 참조하는 글자 참조를 포함하여야 한다; 그러나, 일반 엔티티 참조는 확장 안된 상태로 그대로 있어야 한다. 예를 들어, 아래 선언을 보자:

<!ENTITY % pub    "&#xc9;ditions Gallimard" >
<!ENTITY   rights "All rights reserved" >
<!ENTITY   book   "La Peste: Albert Camus,
&#xA9; 1947 %pub;. &rights;" >

엔티티 교체 텍스트 "book"은:

La Peste: Albert Camus,
?nbsp;1947 ?itions Gallimard. &rights;

일반 엔티티(entity) 참조 "&rights;"는, 문서의 내용(content) 또는 애트리뷰트 값에 나타나는 "&book;"의 참조로, 확장 될 것이다.

이들 단순한 규칙들은 복합 작용들을 할 수 있다; 어려운 예제의 자세한 사항은 D. "엔티티와 글자 참조의 확장(expansion)"을 보라.

4.6 사전에 정의된(predefined) 엔티티

엔티티와 글자 참조는 둘 다 왼쪽 꺽쇄(<), 앰퍼샌드(&)와 다른 구분자(delimiter)들을 에스케입(escape)하여 사용 될 수 있다. 일련의 일반(general) 엔티티(amp, lt, gt, apos, quot)는 이와같은 목적으로 지정되었다. 숫치(numeric) 글자 참조도 사용 될 수 있다; 이들은 인식되는 즉시 확장되고, 글자 데이터로 취급되어야 한다. 그리서 숫치 글자 참조 "&#60;"와 "&#38;"는 글자 데이터에 나타나면 '<'와 '&'를 에스테입(escape)하여 사용 될 수 있다.

모든 XML 처리자(processor)들은 이들 엔티티(entity)들이 선언된 것인가 아닌가를 인식하여야 한다. 공통사용성(interoperability)을 위하여, 유효한(valid) XML 문서들은 이들 엔티티(entity)들이, 다른 것들과 마찬가지로 사용 전에, 선언되어야 한다 문제의 엔티티가 선언되면, 아래 설명과 같이, 그것들은, 그의 교체 텍스트가 에스게입 된 단일 글자이거나 그 글자의 글자 참조인, 내부적 엔티티로 선언되어야 한다.

<!ENTITY lt     "&#38;#60;">
<!ENTITY gt     "&#62;">
<!ENTITY amp    "&#38;#38;">
<!ENTITY apos   "&#39;">
<!ENTITY quot   "&#34;">

"lt"와 "amp"의 선언에서 "<"와 "&" 글자들은, 그 엔티티 대체(replacement)가 잘 형성된 것이 되게 하는데 필요 한, 이중(double)으로 에스케입(escaped) 되었슴에 주의하라.

4.7 주석(notation) 선언

주석들은, 주석(notation) 애트리뷰트, 또는 처리지시(processing instruction)가 보내지는 적용(application)을 갖는, 엘레멘트들의 해석(parse) 안된 엔티티 양식 이름으로 인식(identify)한다.

주석 선언들은, 엔티티(entity)와 애트리뷰트 목록 선언들과 애트리뷰트 규격들의 사용을 위하여, 주석에 이름을 제공한다. 그리고, XML 처리자(processor)에게 허용하는 주석 또는 주어진 주석에서 데이터 처리를 가능하게 하는 도움 적용을 위치시키는 크라이언트(client: 고객) 적용(application)을 위하여, 외부적 인식자(identifier)를 제공한다.

주석 선언(Notation Declarations)
[82] NotationDecl ::= '<!NOTATION' S Name S (ExternalIDPublicID) S? '>'
[83] PublicID ::= 'PUBLIC' S PubidLiteral

XML 처리자(processor)는 적용(application)에 이름과, 애트리뷰트 값, 애트리뷰트(attribute) 정의, 또는 엔티티(entity) 선언에서, 선언되고 참조되는 어떤 주석(notation)의 외부적 인식자(identifier)를 제공하여야 한다. 이들은 추가적으로 외부적 인식자를 시스템 인식자로, 화일 이름으로, 또는 설명된 주석 안의 데이터 처리자를 호출하는 적용을 허용하는데 필요한 다른 정보들을 해결(산출) 할 수 있다. (그러나, XML 문서에서 선언하고, 주석에서 조회하는 XML 처리자(processor) 또는 적용이 작동하고 있는 시스템에 주석 특정 적용(notation-specific application)들이 없다며, 이것은 오류는 아니다.)

4.8 문서(document) 엔티티

문서 엔티티는 엔티티 계통도(tree)에서 최상위(root)로 작용하고, XML 처리자(processor)의 시작점이다. 이규격은 XML 처리자에 의하여 어떻게 문서 엔티티 위치되는가를 정의하고 있지 않다; 다른 엔티티들과는 달리, 문서(document) 엔티티는 이름을 갖고 있지 않고, 지정(인식)이 전혀 없어도 처리자 입력(input) 흐름이 잘 나타날 수 있다.


5. 규격부합성

5.1 유효성 검정하는 처리자와 유효성 검정 않는 처리자

규격에 부합하는 XML 처리자(processor)들은 유효성 검정하는 처리자와 유효성 검정 않는 처리자 두가지 종류 중에 하나이다.

유효성 검정하는 처리자와 유효성 검정 않는 처리자들은 둘 다, 문서 엔티티의 내용과 그가 읽는 다른 해석(parse)된 엔티티들에서, 이규격의 잘 형성됨을 위한 필수사항 위반을 알려주어야 한다.

유효성 검정 처리자들은 DTD에 선언들로 나타낸 제한요소의 위반과, 이규격의 주어진 유효성 검정(validity) 제한요소를 만족시키지 못하는 겻을 알려 주어야 한다. 이를 달성하기 위하여, 유효성 검정 XML 처리자(processor)들은, 전체 DTD와 문서의 모든 참조된 외부적 해석(parse)된 엔티티를 읽고 처리하여야 한다.

유효성 검정 않는 처리자들은 전체 내부적 DTD 하부세트(subset)를 포함하여 문서 엔티티 만 그의 잘 형성됨을 검사하는 것이 필요하다. 그들은 문서의 유효성(validity) 검사가 필요하지 않지만, 내부적 DTD 하부세트와 파라메터(parameter) 엔티티에서 읽은 모든 선언을, 읽지 않은 처음 파라메터 엔티티(entity)를 참조하는데 까지, 처리(process)하는 것은 필요하다; 다시말해, 이것들은, 애트리뷰트 값들을 정상화(normalize)하고, 내부적 엔티티의 교체 텍스트를 포함(include)하고, 디폴트 애트리뷰트 값들을 제공하기 위하여, 선언들에 있는 정보를 사용하여야 한다. 이것들은 엔티티 선언들이나 읽지 않은 파라메터(parameter) 엔티티(entity) 참조 다음에 만나는 애트리뷰트 목록 선언들을 처리(process)하지 말아야 한다. 이는 그 엔티티에는 덮어씌우는 선언들을 포함 할 수 있기 때문이다.

5.2 XML 처리자(processor)의 사용

유효성 검정 XML 처리자의 활동은 상당히 예측 할 수 있다; 이는 문서의 각 부분을 읽고 모든 잘 형성됨과 유효성(validity) 위반을 알려주어야 한다. 유효성 검정 않는 처리자에서는 이보다 적은 필요사항이 있다; 문서 엔티티(entity) 이외의 다른 문서 부분은 읽을 필요가 없다. 이는 XML 처리자(processor)의 사용자들에게 중요한 두가지 효과(영향)이 있다:

  • 어떤 잘 형성됨 오류들, 특히 외부적 엔티티(entity)의 읽음을 필요로하는 것들은 유효성 검정 않는 처리자에 의하여 감지되지 않을 수 있다. 예제들은 선언된 엔티티, 해석(parse)된 엔티티, 반복 없슴로 제목 붙은 제한요소들을 포함한다. 또한 4.4 "XML 처리자의 엔티티와 참조의 처리"의 금지된으로 설명된 일부 경우도 있다.
  • 처리자(processor)로 부터 적용(application)에 전달되는 정보는 처리자가 파라메터와 외부적 엔티티를 읽는가에 따라 달라 질 수 있다. 예를 들어, 유효성 검정 않는 처리자는 애트리뷰트 값의 정상화(normalize), 내부적 엔티티의 교체 텍스트(replacement)의 포함(include) 또는 디폴트 애트리뷰트 값의 제공을 하지 않을 수 있다. 여기서는 외부적 또는 파라메터(parameter) 엔티티(entity)의 읽은 선언들 그다지 의존하지 않는다.

서로 다른 XML 처리자들 사이의 통용성에서 최대의 신뢰성을 위하여, 유효성 검정 않는 처리자들을 사용하는 적용들은 그와 같은 처리자(processor)들에 필요하지 않은 활동(behavior)에 의존하지 말아야 한다. 디폴트(default) 애트리뷰트(attribute)들 또는 외부적 엔티티에 선언된 내부적 엔티티(entity)에 사용하는 것 같은 도구(facilities)들을 필요로 하는 적용들은 유효성 검정 XML 처리자들을 사용하지 말아야 한다.


6. 주석(notation)

이규격에서 간단한 양식(EBNF: Extended Backus-Naur Form)의 주석(notation)을 사용하여 XML의 공식적인 문법이 주어진다. 문법의 각 규칙은 아래와 같은 양식의 부호로 정의되었다.

symbol ::= expression
부호   ::= 공식(표현)

부호(Symbol)들은, 그들이 보통의 표현(공식)으로 정의 되었으면, 첫글자를 대문자로 하였고, 그렇지 않으면 소문자로 시작하였다. 리터랄(literal) 스트링들은 따옴표 안에 넣었다.

공식(코드) 속에 오른쪽 부분에 아래 공식(표현)들로, 짝 맞추어 한개 또는 여러개의 글자들의 스트링을 사용하였다:

#xN
여기서 N은 16진수 정수, 이 공식은 ISO/IEC 10646 canonical (UCS-4) 코드 값 글자와 맞고, 부호 없는 이진수로 해석 할 때는 그 값이 제시되었다. #xN 양식에서 맨 앞의 "0"들은 별 의미가 없다; 맨 앞의 "0"들을 갖는 수치에 해당하는 코드 값은 사용하고 있는 글자 엔코딩(encoding)에 의하여 결정되고, XML에서는 별 의미가 없다.
[a-zA-Z], [#xN-#xN]
값(들)이 지정하는 범위의 아무 글자에나 일치한다(포함).
[^a-z], [^#xN-#xN]
값이 지정하는 범위 밖의 아무 글자에나 일치한다.
[^abc], [^#xN#xN#xN]
주어진 값에 없는 글자들 중 아무 글자에나 일치한다.
"string"
이중 따옴표들 안에 주어진 리터랄(literal) 스트링에 일치하는.
'string'
단일 따옴표들 안에 주어진 리터랄(literal) 스트링에 일치하는.
이 부호(symbol)들은 결합되어 다음과 같이 더 복잡하게 일치할 수 있다. 여기서 AB는 간단한 공식(expression)을 말한다:
(expression)
공식(expression: 표현)은 하나의 단위 취급되고, 이 목록에서 설명하는 바와 같이 결합 될 수 있다.
A?
선택적 A; A 또는 없는것과 일치한다.
A B
A 다음에 바로 B가 오는 것과 일치한다.
A | B
A 또는 B이나 둘 다는 아니다와 일치하다.
A - B
A는 같고 B는 갖지 않은 아무 스트링에서나 일치한다.
A+
A가 한번 혹은 그이상 나타나면 일치한다.
A*
A가 한번도 없던가 그이상 있으면 일치한다.
생성(production)에 사용된 다른 주석(notation)들은 다음과 같다:
/* ... */
코멘트(comment).
[ wfc: ... ]
잘 형성됨을 위한 필수사항(well-formed constraint); 이는 이름으로, 관련된 생성 문서들의 잘 형성됨의 제한요소를 가리킨다.
[ vc: ... ]
유효성 제한요소(valid constraint); 이는 이름으로, 관련된 생성 문서들의 유효성(valid)의 제한요소를 가리킨다.


부록

A. 참조

A.1 지명적 참조

IANA
(인터넷 할당 번호 당국: Internet Assigned Numbers Authority)
글자 세트의 공식 이름(Official Names for Character Sets),
저자: Keld Simonsen 등.
영문 ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets 참조.
IETF RFC 1766
IETF (인터넷 엔지니어링 태스크 포스: Internet Engineering Task Force).
RFC 1766: 언어의 인식을 위한 태그들(Tags for the Identification of Languages),
저자: H. Alvestrand. 1995.
ISO 639
(표준화를 위한 국제 기구: International Organization for Standardization).
ISO 639:1988 (E). 언어 이름 표현을 위한 코드(Codes for the representation of names of countries and their subdivisions).
[Geneva]: International Organization for Standardization, 1988.
ISO 3166
(표준화를 위한 국제 기구: International Organization for Standardization).
ISO 3166-1:1997 (E).
언어 이름 표현을 위한 코드(Codes for the representation of names of countries and their ) -- Part 1: 국가코드(Country codes)

[Geneva]: International Organization for Standardization, 1997.
ISO/IEC 10646
(표준화를 위한 국제 기구: International Organization for Standardization).
ISO/IEC 10646-1993 (E).
정보 기술 -- 국제 복수-8진수 코드 글자 세트(UCS)
Information technology -- Universal Multiple-Octet Coded Character Set
-- Part 1: Architecture and Basic Multilingual Plane.

[Geneva]: International Organization for Standardization, 1993(AM 1-AM 7개정 추가).
Unicode
The Unicode Consortium.
유니코드 표준, 버전 2.0(The Unicode Standard, Version 2.0).
Reading, Mass.: Addison-Wesley Developers Press, 1996.

A.2 다른 참조

Aho/Ullman
Aho, Alfred V., Ravi Sethi, and Jeffrey D. Ullman.
Compilers: Principles, Techniques, and Tools.
Reading: Addison-Wesley, 1986, rpt. corr. 1988.
Berners-Lee 등.
Berners-Lee, T., R. Fielding, and L. Masinter.
통일 자원 인식자들(URI: Uniform Resource Identifiers):
Generic Syntax and Semantics
. 1997.
(Work in progress; see updates to RFC1738.)
Br?gemann-Klein
Br?gemann-Klein, Anne.
Regular Expressions into Finite Automata.
Extended abstract in I. Simon, Hrsg., LATIN 1992, S. 97-98. Springer-Verlag, Berlin 1992.
Full Version in Theoretical Computer Science 120: 197-213, 1993.
Br?gemann-Klein and Wood
Br?gemann-Klein, Anne, and Derick Wood.
Deterministic Regular Languages.
Universit? Freiburg, Institut f? Informatik, Bericht 38, Oktober 1991.
Clark
James Clark. Comparison of SGML and XML.
영문 http://www.w3.org/TR/NOTE-sgml-xml-971215 참조.
IETF RFC1738
IETF (Internet Engineering Task Force).
RFC 1738: Uniform Resource Locators (URL),
저자: T. Berners-Lee, L. Masinter, M. McCahill. 1994.
IETF RFC1808
IETF (Internet Engineering Task Force).
RFC 1808: Relative Uniform Resource Locators,
저자: R. Fielding. 1995.
IETF RFC2141
IETF (Internet Engineering Task Force).
RFC 2141: URN Syntax,
저자: R. Moats. 1997.
ISO 8879
ISO (International Organization for Standardization).
ISO 8879:1986(E).
정보 처리 -- 텍스트와 오피스 시스템 -- (SGML언어)
Information processing -- Text and Office Systems -- Standard Generalized Markup Language (SGML)
First edition -- 1986-10-15.
[Geneva]: International Organization for Standardization, 1986.
ISO/IEC 10744
ISO (International Organization for Standardization).
ISO/IEC 10744-1992 (E).
정보 기술 -- Hypermedia/Time-based Structuring (HyTime 언어).

[Geneva]: International Organization for Standardization, 1992.
Extended Facilities Annexe.
[Geneva]: International Organization for Standardization, 1996.

B. 글자 분류

다음 유니코드(Unicode) 표준에 정의된 특징들 글자은 분류되어있다. 기초(base) 글자(다른것들 보다 이들은 영어(Latin)의 알파베트 글자들을 포함하고, 구분글자(diacritics)는 제외된다), 표식글자(ideographic) 글자, 그리고 결합(combining) 글자들(무엇보다 이 분류는 대부분의 구분글자(diacritics)을 포함)로 ; 이들 분류는 결합하여 글자들의 분류를 만든다. 숫자와 확장자(extender)들도 구별하였다.

글자들(Characters)
[84] Letter ::= BaseChar | Ideographic
[85] BaseChar ::= [#x0041-#x005A] | [#x0061-#x007A] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | [#x00F8-#x00FF] | [#x0100-#x0131] | [#x0134-#x013E] | [#x0141-#x0148] | [#x014A-#x017E] | [#x0180-#x01C3] | [#x01CD-#x01F0] | [#x01F4-#x01F5] | [#x01FA-#x0217] | [#x0250-#x02A8] | [#x02BB-#x02C1] | #x0386 | [#x0388-#x038A] | #x038C | [#x038E-#x03A1] | [#x03A3-#x03CE] | [#x03D0-#x03D6] | #x03DA | #x03DC | #x03DE | #x03E0 | [#x03E2-#x03F3] | [#x0401-#x040C] | [#x040E-#x044F] | [#x0451-#x045C] | [#x045E-#x0481] | [#x0490-#x04C4] | [#x04C7-#x04C8] | [#x04CB-#x04CC] | [#x04D0-#x04EB] | [#x04EE-#x04F5] | [#x04F8-#x04F9] | [#x0531-#x0556] | #x0559 | [#x0561-#x0586] | [#x05D0-#x05EA] | [#x05F0-#x05F2] | [#x0621-#x063A] | [#x0641-#x064A] | [#x0671-#x06B7] | [#x06BA-#x06BE] | [#x06C0-#x06CE] | [#x06D0-#x06D3] | #x06D5 | [#x06E5-#x06E6] | [#x0905-#x0939] | #x093D | [#x0958-#x0961] | [#x0985-#x098C] | [#x098F-#x0990] | [#x0993-#x09A8] | [#x09AA-#x09B0] | #x09B2 | [#x09B6-#x09B9] | [#x09DC-#x09DD] | [#x09DF-#x09E1] | [#x09F0-#x09F1] | [#x0A05-#x0A0A] | [#x0A0F-#x0A10] | [#x0A13-#x0A28] | [#x0A2A-#x0A30] | [#x0A32-#x0A33] | [#x0A35-#x0A36] | [#x0A38-#x0A39] | [#x0A59-#x0A5C] | #x0A5E | [#x0A72-#x0A74] | [#x0A85-#x0A8B] | #x0A8D | [#x0A8F-#x0A91] | [#x0A93-#x0AA8] | [#x0AAA-#x0AB0] | [#x0AB2-#x0AB3] | [#x0AB5-#x0AB9] | #x0ABD | #x0AE0 | [#x0B05-#x0B0C] | [#x0B0F-#x0B10] | [#x0B13-#x0B28] | [#x0B2A-#x0B30] | [#x0B32-#x0B33] | [#x0B36-#x0B39] | #x0B3D | [#x0B5C-#x0B5D] | [#x0B5F-#x0B61] | [#x0B85-#x0B8A] | [#x0B8E-#x0B90] | [#x0B92-#x0B95] | [#x0B99-#x0B9A] | #x0B9C | [#x0B9E-#x0B9F] | [#x0BA3-#x0BA4] | [#x0BA8-#x0BAA] | [#x0BAE-#x0BB5] | [#x0BB7-#x0BB9] | [#x0C05-#x0C0C] | [#x0C0E-#x0C10] | [#x0C12-#x0C28] | [#x0C2A-#x0C33] | [#x0C35-#x0C39] | [#x0C60-#x0C61] | [#x0C85-#x0C8C] | [#x0C8E-#x0C90] | [#x0C92-#x0CA8] | [#x0CAA-#x0CB3] | [#x0CB5-#x0CB9] | #x0CDE | [#x0CE0-#x0CE1] | [#x0D05-#x0D0C] | [#x0D0E-#x0D10] | [#x0D12-#x0D28] | [#x0D2A-#x0D39] | [#x0D60-#x0D61] | [#x0E01-#x0E2E] | #x0E30 | [#x0E32-#x0E33] | [#x0E40-#x0E45] | [#x0E81-#x0E82] | #x0E84 | [#x0E87-#x0E88] | #x0E8A | #x0E8D | [#x0E94-#x0E97] | [#x0E99-#x0E9F] | [#x0EA1-#x0EA3] | #x0EA5 | #x0EA7 | [#x0EAA-#x0EAB] | [#x0EAD-#x0EAE] | #x0EB0 | [#x0EB2-#x0EB3] | #x0EBD | [#x0EC0-#x0EC4] | [#x0F40-#x0F47] | [#x0F49-#x0F69] | [#x10A0-#x10C5] | [#x10D0-#x10F6] | #x1100 | [#x1102-#x1103] | [#x1105-#x1107] | #x1109 | [#x110B-#x110C] | [#x110E-#x1112] | #x113C | #x113E | #x1140 | #x114C | #x114E | #x1150 | [#x1154-#x1155] | #x1159 | [#x115F-#x1161] | #x1163 | #x1165 | #x1167 | #x1169 | [#x116D-#x116E] | [#x1172-#x1173] | #x1175 | #x119E | #x11A8 | #x11AB | [#x11AE-#x11AF] | [#x11B7-#x11B8] | #x11BA | [#x11BC-#x11C2] | #x11EB | #x11F0 | #x11F9 | [#x1E00-#x1E9B] | [#x1EA0-#x1EF9] | [#x1F00-#x1F15] | [#x1F18-#x1F1D] | [#x1F20-#x1F45] | [#x1F48-#x1F4D] | [#x1F50-#x1F57] | #x1F59 | #x1F5B | #x1F5D | [#x1F5F-#x1F7D] | [#x1F80-#x1FB4] | [#x1FB6-#x1FBC] | #x1FBE | [#x1FC2-#x1FC4] | [#x1FC6-#x1FCC] | [#x1FD0-#x1FD3] | [#x1FD6-#x1FDB] | [#x1FE0-#x1FEC] | [#x1FF2-#x1FF4] | [#x1FF6-#x1FFC] | #x2126 | [#x212A-#x212B] | #x212E | [#x2180-#x2182] | [#x3041-#x3094] | [#x30A1-#x30FA] | [#x3105-#x312C] | [#xAC00-#xD7A3]
[86] Ideographic ::= [#x4E00-#x9FA5] | #x3007 | [#x3021-#x3029]
[87] CombiningChar ::= [#x0300-#x0345] | [#x0360-#x0361] | [#x0483-#x0486] | [#x0591-#x05A1] | [#x05A3-#x05B9] | [#x05BB-#x05BD] | #x05BF | [#x05C1-#x05C2] | #x05C4 | [#x064B-#x0652] | #x0670 | [#x06D6-#x06DC] | [#x06DD-#x06DF] | [#x06E0-#x06E4] | [#x06E7-#x06E8] | [#x06EA-#x06ED] | [#x0901-#x0903] | #x093C | [#x093E-#x094C] | #x094D | [#x0951-#x0954] | [#x0962-#x0963] | [#x0981-#x0983] | #x09BC | #x09BE | #x09BF | [#x09C0-#x09C4] | [#x09C7-#x09C8] | [#x09CB-#x09CD] | #x09D7 | [#x09E2-#x09E3] | #x0A02 | #x0A3C | #x0A3E | #x0A3F | [#x0A40-#x0A42] | [#x0A47-#x0A48] | [#x0A4B-#x0A4D] | [#x0A70-#x0A71] | [#x0A81-#x0A83] | #x0ABC | [#x0ABE-#x0AC5] | [#x0AC7-#x0AC9] | [#x0ACB-#x0ACD] | [#x0B01-#x0B03] | #x0B3C | [#x0B3E-#x0B43] | [#x0B47-#x0B48] | [#x0B4B-#x0B4D] | [#x0B56-#x0B57] | [#x0B82-#x0B83] | [#x0BBE-#x0BC2] | [#x0BC6-#x0BC8] | [#x0BCA-#x0BCD] | #x0BD7 | [#x0C01-#x0C03] | [#x0C3E-#x0C44] | [#x0C46-#x0C48] | [#x0C4A-#x0C4D] | [#x0C55-#x0C56] | [#x0C82-#x0C83] | [#x0CBE-#x0CC4] | [#x0CC6-#x0CC8] | [#x0CCA-#x0CCD] | [#x0CD5-#x0CD6] | [#x0D02-#x0D03] | [#x0D3E-#x0D43] | [#x0D46-#x0D48] | [#x0D4A-#x0D4D] | #x0D57 | #x0E31 | [#x0E34-#x0E3A] | [#x0E47-#x0E4E] | #x0EB1 | [#x0EB4-#x0EB9] | [#x0EBB-#x0EBC] | [#x0EC8-#x0ECD] | [#x0F18-#x0F19] | #x0F35 | #x0F37 | #x0F39 | #x0F3E | #x0F3F | [#x0F71-#x0F84] | [#x0F86-#x0F8B] | [#x0F90-#x0F95] | #x0F97 | [#x0F99-#x0FAD] | [#x0FB1-#x0FB7] | #x0FB9 | [#x20D0-#x20DC] | #x20E1 | [#x302A-#x302F] | #x3099 | #x309A
[88] Digit ::= [#x0030-#x0039] | [#x0660-#x0669] | [#x06F0-#x06F9] | [#x0966-#x096F] | [#x09E6-#x09EF] | [#x0A66-#x0A6F] | [#x0AE6-#x0AEF] | [#x0B66-#x0B6F] | [#x0BE7-#x0BEF] | [#x0C66-#x0C6F] | [#x0CE6-#x0CEF] | [#x0D66-#x0D6F] | [#x0E50-#x0E59] | [#x0ED0-#x0ED9] | [#x0F20-#x0F29]
[89] Extender ::= #x00B7 | #x02D0 | #x02D1 | #x0387 | #x0640 | #x0E46 | #x0EC6 | #x3005 | [#x3031-#x3035] | [#x309D-#x309E] | [#x30FC-#x30FE]

여기에 정의된 글자 분류는 다음과 같이 유니코드(Unicode) 글자 데이터베이스 기초로 부터 만들어 질 수 있다:

  • 이름의 시작 글자는 Ll, Lu, Lo, Lt, Nl 가운데 하나이여야 한다.
  • Name-start 글자 이외의 이름 글자들은 Mc, Me, Mn, Lm, 또는 Nd 중 하나를 가져어야 한다.
  • compatibility area에 있는 글자들(말하자면 with 글자 코드가 #xF900 보다 크고 #xFFFE 보다 작은)은 XML 이름에 허용되지 않는다.
  • 폰트(font) 또는 통용성 전환(compatibility decomposition)을 갖는 글자들(말하자면 이들은 "compatibility formatting tag"를 가지고 데이터베이스의 필드 5에 있는 -- field 5로 표시되고 "<"로 시작하는)은 허용되지 않는다.
  • 다음 글자들은, 특성 화일이 그들을 알파베틱으로 분류하였슴으로, 이름 글자들이 아니고 이름 시작 글자로 취급된다: [#x02BB-#x02C1], #x0559, #x06E5, #x06E6.
  • #x20DD-#x20E0 벙위의 글자들은 제외되었다(Unicode, 항목 5.14에 따라).
  • 글자 #x00B7는, 특성 목록이 지정한대로, 확장자(extender)로 분류된다.
  • 글자 #x0387는 이름 글자로 추가된다, #x00B7은 그는 정규적으로 동일함으로.
  • ':' 와 '_' 글자들은 이름 시작 글자들에 허용된다.
  • '-' 와 '.'글자들은 이름 글자들에 허용된다.

C. XML 과 SGML (비지명적)

XML은 SGML의 하부세트(subset)가 되도록 설계되었고, 여기서 각 유효한(valid) XML 문서는 SGML 문서에도 맞아야 한다. SGML에서와 달리 XML이 문서들에 추가적으로 제한 한 상세 비교는 [Clark]을 참조하라.


D. 엔티티와 글자 참조의 확장 (비지명적)

이 부록은, 4.4 "XML 처리자의 엔티티와 참조의 처리"에 설명 한 바와 같이, 엔티티(entity)- 와 글자-참조의 인식(recognition)과 확장(expansion)의 순서를 설명하는 일부 예제들을 포함하고 있다.

선언이 DTD를 포함하려면

<!ENTITY example "<p>An ampersand (&#38;#38;) may be escaped
numerically (&#38;#38;#38;) or with a general entity
(&amp;amp;).</p>" >

그러면, 엔티티(entity) 선언이 해석(parse)되면 XML 처리자(processor)는 그 글자 참조를 인식 할 것이고, 이를 해결(resolve)하여 엔티티 "example"의 값으로 아래 스트링을 저장한다:

<p>An ampersand (&#38;) may be escaped
numerically (&#38;#38;) or with a general entity
(&amp;amp;).</p>

문서에서 "&example;"을 참조하면 텍스트는 다시 해석(reparse)되고, 이때에는 "p" 엘레멘트의 시작태그와 종료태그가 인식 될 것이고, 세개의 참조들은 인식되고 확장(expand)되어, "p" 엘레멘트(element)는 아래 내용(content)을 가질 것이다(모든 데이터는 있으나 구분자나 코드는 없는):

An ampersand (&) may be escaped
numerically (&#38;) or with a general entity
(&amp;).

더 복잡한 예제는 코드(rule)와 그 효과를 완전히 설명 할 것이다. 아래 예제에서, 줄 번호는 오직 참고 만를 위한 것이다.

1 <?xml version='1.0'?>
2 <!DOCTYPE test [
3 <!ELEMENT test (#PCDATA) >
4 <!ENTITY % xx '&#37;zz;'>
5 <!ENTITY % zz '&#60;!ENTITY tricky "error-prone" >' >
6 %xx;
7 ]>
8 <test>이 sample shows a &tricky; method.</test>

이는 아래의 결과를 만든다:

  • 4번, 글자 37 참조는 즉시 확장되고, 파라메터(parameter) 엔티티(entity) "xx"는 값 "%zz;"로 부호(symbol) 테이블에 저장된다. 교체 텍스트가 없어 파라메터(parameter) 엔티티(entity) "zz"의 참조는 인식하지 못한다. ("zz"가 아직 선언되지 않았슴으로, 이는 오류일 것이다.)
  • 5번, "&#60;" 글자 참조는 즉시 확장되고, 파라메터(parameter) 엔티티(entity) "zz"는 교체 텍스트 "<!ENTITY tricky "error-prone" >"로 저장되며, 이는 잘 형성된 엔티티(entity) 선언이다.
  • 6번, "xx" 참조는 인식되고, "xx"("%zz;") 교체 텍스트는 해석(parse)된다. 이번에는 "zz" 참조가 인식되고, 그 교체 텍스트("<!ENTITY tricky "error-prone" >")가 해석(parse)된다. 일반(general) 엔티티(entity) "tricky"가 이제 선언되어, 교체(replacement) 텍스트 "error-prone"를 갖는다.
  • 8번, 일반(general) 엔티티(entity) "tricky" 참조는 인식되고, 확장되어, "test" 엘레멘트(element)의 완전한 내용(content)은 문법이 없는 그대로 기술하는 스트링 "This sample shows a error-prone method."가 된다.

E. 판정적 내용 모델 (비지명적)

규격부합성(compatibility)을 위하여, 엘레멘트 타입 선언에서 내용(content) 모델(model)들은 판정적이 될 필요가 있다.

SGML은 판정적 내용 모델("unambiguous(명확한)"로 불리움)을 필요로 한다; SGML 시스템을 사용하는 XML 처리자(processor)들은 비 판정적 내용 모델을 오류들로 표시 할 수 있다.

예를 들어, 내용(content) 모델(model) ((b, c) | (b, d))는 비 판정적이다. 주어진 최초의 b로는, b 위에 따라오는 엘레멘트(element)를 내다 보지 않고는, 해석자(parser)가 모델(model)의 어느 b가 일치 검사되는가 알 수 없기 때문이다. 이 경우, b의 두 참조는 단일 참조로 붕괴되어, (b, (c | d)) 모델(model)을 만들 수 있다. 이제 최초의 'b'는 명확히 내용(content) 모델(model)의 단일 이름과 만 일치 검정을 한다. 해석자(parser)는 앞에 무엇이 따라오는가를 알 필요가 없다; 'c' 또는 'd'가 받아 질 것이다.

어 공식적으로: 유한 문장 자동화는 내용 모델로 부터 표준 기능(algorithm)들을 사용하여 구성 될 수 있다. 예를 들면 Aho, Sethi와 Ullman [Aho/Ullman]의 항목 3.9 기능(algorithm) 3.5. 많은 이와 같은 기능(algorithm)들에서, 일반 공식(표현)으로 각 위치에 후속 세트가 구성된다 (말하자면, 일반 공식(표현) 문법 체계에서 각각 행할 조각); 만일 어떤 위치에, 같은 엘레멘트 타입 이름 안에 하나 이상의 후속 위치가 라벨되어 있는, 후속 세트가 있으면, 내용 모델은 오류이며, 오류로 알릴 수 있다.

많은 것을 허용하는 기능(algorithm)들이 있지만, 모든 비 판정적 내용 모델이 같은 판정적 모델(model)에서 처럼 자동 정리하는 것은 아니다; Br?gemann-Klein 1991 [Br?gemann-Klein] 참조.


F. 글자 엔코딩의 자동감지 (비지명적)

XML 엔코딩(encoding) 선언은 각 엔티티(entity)에, 어떤 글자 엔코딩이 사둉되고 있는가를 나타내는, 내부적으로 라벨(label)로 기능(function)한다. 그러나, XML 처리자(processor)가 내부적 라벨(label)을 읽을 수 있기 전에, 어떤 글자 엔코딩)이 사용되고 있는가(어떤 내부적 라벨을 지정하려고 하는가)를 알아야 한다는 것은 명백하다. 일반적인 경우, 이것은 가망이 없는 상황이다. 그러나, XML에서 완전히 불가능 한 것은 아니다. XML은 일반적인 경우를 두가지 방식으로 제한하기 때문이다: 각 적용(implementation)은 글자 엔코딩(encoding)들의 한정된 세트만을 지원하는 것으로 간주되고, XML 엔코딩 선언은, 정상적인 경우 각 엔티티(entity)에 사용되는 글자 엔코딩을 자동 검정이 가능하게 하기 위하여, 위치와 내용(content)이 제한된다. 또한, 많은 경우 XML 데이터 흐름 자체에 추가적으로 사용 할 수 있는 다른 정보 자원들이 있다. XML 엔티티(entity)가 처리자에게 다른 동반하는 (외부적) 정보를 제시하는가 않는가에 따라, 두가지 경우가 구별 될 수 있다. 먼저 제시하지 않는 경우를 보자.

UTF-8 또는 UTF-16가 아닌 각 XML 엔티티 양식은 반드시 XML 엔코딩 선언으로 시작하여야 되기 때문에, 여기서 첫 글자들은 '<?xml'이어야 하며, 규격에 부합하는 처리자(processor)는 감지 할 수 있를 것이고, 두개에서 네개의 8진 숫치 입력 후에는 다음이 적용된다. 이 목록을 읽는데 UCS-4에서 '<'는 "#x0000003C"이고 '?'는 "#x0000003F"이며, 데이터 흐름에 필요한 UTF-16의 Byte Order Mark는 "#xFEFF"이라는 것을 알면 도움이 된다.

  • 00 00 00 3C: UCS-4, big-endian machine (1234 순서)
  • 3C 00 00 00: UCS-4, little-endian machine (4321 순서)
  • 00 00 3C 00: UCS-4, unusual octet order (2143)
  • 00 3C 00 00: UCS-4, unusual octet order (3412)
  • FE FF: UTF-16, big-endian
  • FF FE: UTF-16, little-endian
  • 00 3C 00 3F: UTF-16, big-endian, no Byte Order Mark (엄격히 말하면 오류)
  • 3C 00 3F 00: UTF-16, little-endian, no Byte Order Mark (엄격히 말하면 오류)
  • 3C 3F 78 6D: UTF-8, ISO 646, ASCII, ISO 8859의 일부 부분, Shift-JIS, EUC, 또는 다른 어떤 7-bit, 8-bit, 또는 혼합 너비(mixed-width) 엔코딩(encoding), 이는 ASCII 그 글자들은 정상위치, 너비와 값들을 갖는다 것을 확인한다; 이들 중 어느것이 적용된다는 것을 알기 위해, 실제 엔코딩 선언이 읽어져야 하지만, 이들 엔코딩들은 모두 ASCII 글자들에서 같은 이진수(bit) 형태(patterns)를 사용하므로, 엔코딩(encoding) 선언 자체를 읽는 것이 가능하다.
  • 4C 6F A7 94: EBCDIC (어떤 선호로; 어떤 코드 페이지가 사용되는가는 알려면 완전한 엔코딩 선언이 읽혀져야 한다.)
  • 기타: 엔코딩(encoding) 선언 없는 UTF-8, 또는 아니면 데이터 흐름이 붕괘되는, 부위적(fragmentary), 또는 어떤 종류의 포장(wrapper) 안에 쌓인

이 수준의 자동감지는 XML 엔코딩(encoding) 선언을 읽고, 글자 엔코딩 인식자(identifier)에 해석(parse)하는데는 충분하다. 여전히 각 엔코딩 가족의 개별 구성원을 구별하는 것이 필요하다. (예를 들어 8859로 부터 UTF-8, 서로 다른 8859의 부분, 또는 사용하는 특정 EBCDIC 코드 페이지(code page)를 구별, 등).

엔코딩 선언의 내용들이 ASCII 글자로 제한되기 때문에, 처리자(processor)는, 사용되는 엔코딩(encoding) 가족(family)가 감지되면, 전체 엔코딩 선언을 쉽게 읽을 수 있다. 실제적으로, 모든 널리 사용되는 글자 엔코딩들은 위의 하나에 해당되므로, 운영체계나 송신 프로토콜(transport-protocol) 수준의 외부적 자원 정보에서 현실성이 적은 경우도, XML 엔코딩 선언은 상당히 합리적으로, 글자 엔코딩(encoding)들의 범위 라벨링(labeling)하도록, 허용한다.

일단 처리자(processor)가 사용하는 글자 엔코딩을 감지하면, 각 입력 과정을 달리 불러 할 것인가, 혹은 각 입력 글자에 적당한 변환 기능(function)을 호출 할 것인가등에, 적정하게 작용 할 수 있다.

다른 자체 라벨링(self-labeling) 체계에서와 마찬가지로, 어떤 소프트웨어가 엔코딩(encoding) 선언 갱신 없이 엔티티(entity)의 글자 세트 또는 엔코딩에 변경을 주면, XML 엔코딩 선언은 작용하지 않을 것이다. 글자 엔코딩 과정 적용자(Implementor)들은 사용된 내부적, 외부적 정보를 엔티티(entity)에 라벨(label)하는데 정확히 하도록 주의하여야 한다.

두변째 가능한 경우는, 일부 화일 시스템과 네트워크 프로토콜에서 처럼, XML 엔티티(entity)가 엔코딩 정보와 함께 올 때, 발생된다. 복수 정보 자원을 사용 할 수 있을 때, 그들 사이의 상대적 우선순위와 마찰(모순)의 경우 선호되는 처리 방식(method)은 XML을 전달하는데 사용되는 상위 레벨 프로토콜(protocol)의 부분으로 지정되어야 한다 내부적 라벨(label)과 외부적 헤더(header)의 "MIME-type" 라벨 사이의 상대적 우선순위 규칙들은, 예를 들어, "text/xml"와 "application/xml MIME type"을 정의하는 RFC 문서의 부분이어야 한다. 그러나, 공통사용성(interoperability)의 견지에서 아래 규칙들이 추천된다.

  • XML 엔티티가 화일 안에 있으면, 글자 엔코딩(encoding)을 결정하기 위하여 Byte-Order Mark와 엔코딩 선언 PI가 (있으면) 사용된다; 모든 다른 정보 계통(heuristics) 및 자원(source)들은 오류회복 만을 위한 것이다.
  • XML 엔티티가 "text/xml"의 "MIME type" 과 함께 전달(배달)되면, "MIME type"의 charset 파라메터(parameter)가 글자 엔코딩(encoding) 방식(method)을 결정한다; 모든 다른 정보 계통 및 자원들은 오류회복 만을 위한 것이다.
  • XML 엔티티(entity)가 "application/xml"의 "MIME type" 과 함께 전달(배달)되면 글자 엔코딩(encoding)을 결정하기 위하여 Byte-Order Mark 와 엔코딩 선언 PI가 (있으면) 사용된다; 모든 다른 정보 계통(heuristics) 및 자원(source)들은 오류회복 만을 위한 것이다.

이 규칙들은 프로토콜 수준(protocol-level) 문서가 없을 때에 만 적용된다; 구체적으로, "MIME types text/xml"와 "application/xml"이 정의 되었으면, 해당 RFC 추천안들은 이 규칙들을 적용하지 말아야 한다.


G. W3C XML 작업구룹(Working Group) (비지명적)

이규격은 W3C XML 작업구룹(WG: Working Group)에 의하여 발행을 위하여 준비되고 승인되었다. 이규격의 WG 승인은 모든 WG 구성원이 '승인'에 투표하였슴을 의미하는 것은 아니다. 현재와 과거의 XML WG 구성원들은:

Jon Bosak, Sun (Chair); James Clark (Technical Lead); Tim Bray, Textuality and Netscape (XML Co-editor); Jean Paoli, Microsoft (XML Co-editor); C. M. Sperberg-McQueen, U. of Ill. (XML Co-editor); Dan Connolly, W3C (W3C Liaison); Paula Angerstein, Texcel; Steve DeRose, INSO; Dave Hollander, HP; Eliot Kimber, ISOGEN; Eve Maler, ArborText; Tom Magliery, NCSA; Murray Maloney, Muzmo and Grif; Makoto Murata, Fuji Xerox Information Systems; Joel Nava, Adobe; Conleth O'Connell, Vignette; Peter Sharpe, SoftQuad; John Tigue, DataChannel

영문 저작권? 영문 W3C (영문 MIT, 영문 INRIA, 영문 Keio ), 모든 권리 보유. W3C 영문 책임, 영문 상표권, 영문 문서 사용영문 소프트웨어 면허 규칙들 적용.


W3C의 문서 사용을 위한 법를적 문제는 원문을 참조하라.
번역자는 이 번역문에 대한 직, 간접적인 일체의 책임을 지지 않는다.

다른 규격 번역문들
[HTML 4] [CSS 2] [CSS 1] [XHTML 1.0]
번역문 제공자 : 트리오 웹 프랜드 Trio 홈페이지
이문서(http://trio.co.kr/webrefer/xml/xml10.html)는 자유로이 연결 사용이 가능함.
 
한 주 동안 안녕하셨나요? 강좌 담당자 천랑입니다.

요 근래 며칠 동안은 정말 바깥 바람이 날카로운 칼을 들고 돌진해 오는 무사 같아서 밖에 나가기 겁이 나더군요. 게다가 땅바닥까지 얼음판이니 도망갈 수도 없구. ^^;; 내일 부터는 날씨가 좀 풀린다니 정말 다행입니다. 이젠 목욕탕에 가서 세수를 하지 않아도 되겠군요. (저희 집엔 물이 안나온답니다. ㅠ.ㅠ)

지난 제 2강에서는 W3C의 XML 스펙의 가장 첫부분에 해당하는 저작권과, 문서의 지위, XML의 기원과 설계 목표, 용어의 정의 등에 대해 살펴보았습니다. 많은 분들이 World Wide Web 콘소시움(W3C)의 사이트에 한번씩은 들려 보셨을 것 같은데요. 관찰력이 뛰어난 분이라면 W3C의 XML 1.0 스펙의 메인 페이지에 XML 1.0 한국어판 번역문이 링크되어 있는 것을 보셨을 것입니다. 1999년도에 Techno2000 이라는 회사에서 번역해 주신 것인데요. 많은 사람들이 관심을 갖기 이전에 발빠르게 번역문을 올려 주셔서 감사하게 생각합니다만 최근의 XML 용어의 한글화 작업과정에서 달라진 용어들도 있고, 해석상의 차이점 등등으로 윈도우 사용자 그룹에서는 XML 1.0 스펙을 다시 번역하였습니다. 지금 여러분이 보시고 계시는 XML 1.0 스펙 본문은 저를 비롯한 윈도우 사용자 그룹이 번역한 번역본이랍니다. ^^

그럼 오늘은 도큐먼트(Document)에 대해 좀 더 자세히 알아보도록 합시다.
 
<스펙 본문>
2. 도큐먼트(Documents)

문법을 따르고 있는(well-formed) 하나의 데이터 객체는 이 스펙에 정의되어 있는 대로 하나의 XML 도큐먼트가 된다. 문법을 따르는 XML 도큐먼트는 몇 가지 강제사항들을 만족하면 부수적으로 유효한 XML 도큐먼트가 될 수 있다. 각각의 XML 도큐먼트는 논리적 구조와 물리적 구조를 모두 갖는다. 물리적으로 도큐먼트는 엔터티라고 불리는 단위들로 구성되어 있다. 하나의 엔터티는 도큐먼트에 다른 엔터티들을 포함시키기 위해 다른 엔터티들을 참조할 수 있다. 도큐먼트는 "루트" 또는 도큐먼트 엔터티에서 시작한다. 논리적으로 도큐먼트는 선언들, 요소들, 주석들, 문자 레퍼런스들, 처리 지시문들로 구성되어 있으며, 이 모든 구성 요소들은 도큐먼트 안에서 명시적인 마크업에 의해 지시된다. 물리적 및 논리적 구조는 "4.3.2 문법을 따르는 파싱되는 엔터티들"에 기술된 것처럼 반드시 적절하게 중첩되어야만 한다.

 
<천랑의 주석>
도큐먼트의 구조와 단위
이 부분은 XML 도큐먼트를 구성하는 '단위'들에 대해 설명하고 있습니다. XML에서의 도큐먼트라는 개념은 지난 2강에서 우리가 일반적으로 쓰는 '문서'의 막연한 개념이 아닌 "데이터 객체들의 클래스"라는 구체적 개념으로 쓰인다고 이야기 했었습니다.

XML 도큐먼트는 두 가지 조건을 요구합니다. 그 중 하나는 문법적합성(well-formedness)이고, 다른 하나는 유효성(Validity)입니다. 지긋지긋하던 고등학교 때의 수학 용어를 빌리자면 문법적합성은 XML 도큐먼트의 "충분조건"이 되고, 유효성은 XML 도큐먼트의 "필요조건"이 됩니다. 즉, XML 도큐먼트가 되기 위해서는 반드시 "문법적합성"을 만족해야 하지만, 꼭 "유효성"을 만족할 필요는 없다는 말입니다. 모든 파서(Parser - XML Document를 처리하는 프로세서)는 XML Document를 처리할 때 기본적으로 "문법적합성"을 만족하고 있는지 검사합니다. "유효성"은 특정한 목적을 위해서 주로 사용되는 선택사양 정도로 생각하셔도 될 것 같네요.

위의 스펙 본문은 그 자체로 대단히 짧습니다만, XML의 기본적인 골격을 이루는 중요한 내용이 들어 있습니다. 그 것은 바로 XML 도큐먼트의 물리적 구조와 논리적 구조를 이루는 단위들에 대한 내용입니다.

어떤 도큐먼트(앞으로 이 강좌에서 그냥 '도큐먼트'라고 하면 'XML 도큐먼트'를 말하는 것입니다)의 물리적 구조는 그 도큐먼트를 구성하는 엔터티들의 관계가 됩니다. 그리고 이러한 엔터티들 중에서 가장 중요한 엔터티가 바로 "도큐먼트 엔터티"가 되는 것이죠. XML을 다루는 프로그램은 일단 도큐먼트 엔터티 안에서 또 다른 엔터티 자체를 다루거나 다른 엔터티를 참조하는 것들을 다루게 됩니다. 엔터티에 대해서는 나중에 좀 더 자세하게 다루도록 하죠.

도큐먼트의 논리적 구조는 바로 정보의 계층적 구조를 말합니다. XML에 좀 관심을 가진 분들은 아마도 XML이 자주 데이터베이스와 비교되어 다루어지고 있음을 알고 있을 것입니다. 기존의 데이터베이스가 수평적 구조(Flatten Structure)로 데이터의 관계를 정의하는데 성공적이었다면, XML은 계층적 구조(Hierarchical Structure)로 데이터의 관계를 나타내는데 아주 효과적이기 때문이죠. 흔히들 트리 구조(Tree Structure)라고 부른는 형태의 데이터 관계를 데이터베이스로 모델링할 때 겪게 되는 어려움을 생각해 본다면 왜, XML과 데이터베이스가 상호 보완적으로 유기적인 결합을 꾀하려하는지 그 이유를 알 수 있을 것입니다. 계층 구조를 모델링하는 방법에 대해서는 '문법을 따르는 XML 도큐먼트(Well-formed XML Document)'를 다룰 때 예제를 통해 살펴보도록 하죠.

이번 시간까지는 주로 장황하게 말로 설명했습니다만 다음 시간부터는 간단한 예를 통해 위 스펙의 마지막 문장에 있는 '적절하게 중첩된'의 의미와 'Well-formed XML 도큐먼트'의 의미에 대해 좀 더 자세히 알아보도록 합시다.

날씨가 워낙 추워서 감기 바이러스도 활동을 못할 것 같습니다만, 모두들 몸 건강히 다음 시간에 뵙도록 하죠. 그럼.

참 고
현재 시중에 출간되어 있는 많은 도서들이 Well-formed XML Document를 "잘 구성된(또는 잘 형성된) XML 도큐먼트"로 번역하고 있습니다만 제 짧은 생각은 역시 Well-formed XML Document는 "문법을 따르는 XML 도큐먼트"로 번역하는 것이 훨씬 오해의 소지가 줄어든다고 생각합니다. 그리고 사전을 찾아보면 아시겠지만 "Well-formed"라는 단어는 "문법에 맞는"이란 의미를 갖는다고 명시되어 있기도 하구요. 저두 처음에 번역서를 볼 때, 잘 형성된 XML 문서, 잘 구성된 XML 문서라는 말의 의미를 제대로 이해하지 못했던 기억이 나거든요. ^^

(2001. 09) 이 강좌를 쓸 시점에는 Well-formed에 해당하는 적절한 단어가 없어 일단 "문법을 따르는"으로 번역했습니다만, 최근 국내에 XML 관련 도서들이 많이 번역되면서 용어의 통일이 어느 정도 이루어졌습니다. 최근 번역서의 경우 "Well-formed XML"은 "적격 XML"로, "Valid XML"은 "적합 XML"로 번역하고 있고, 저 또한 XML 공동체에서 합의가 이루어진다면 위의 두 용어가 더 낫다고 생각합니다.

또, 한 가지 덧붙이자면 이 스펙을 번역할 시점에는 XML에 대한 이야기가 풍부하게 논의되지 않았었기 때문에, "XML Document"에서 "Document"를 일반적인 "문서"와는 다른 개념을 가진 데이터 저장소로서 그대로 "도큐먼트"라고 썼었습니다만, 이제는 XML에 관련된 책 안에서는 그냥 "문서"라고 써도 무방할 것 같습니다.
참고가 되었나요? ^^;

 

저작권 정보

 

본 강좌는 Prentice Hall 출판사의
"XML: The Annotated Specification"을 일부 참고하였음을 밝힙니다.

본 강좌에서 사용하고 있는 XML 1.0 스펙의 한국어 번역본은 윈도우 사용자 그룹에 그 저작권이 있으며, 이 스펙 전체가 단 한 구절도 훼손되지 않는 경우에 한하여 배포될 수는 있으나 기타 상업적인 목적으로의 전재 및 인용은 금합니다

1. 서론(Introduction) : 1.1 기원과 목표(Origin and Goals) : 1.2 용어(Terminology)
 
<스펙 본문>
저작권
Copyright 1995-1998 World Wide Web Consortium, (Massachusetts Institute of Technology, Institut National de Recherche en Informatique et en Automatique, Keio University). All Rights Reserved. http://www.w3.org/Consortium/Legal/ 이 문서는 1999년 2월 17일에 http://www.w3.org/XML/xml-19980210-errata에 게시된 정오표의 내용 또한 적용하여 편집하였다.

이 문서의 한국어 번역물에 대한 저작권은 본 문서의 역자인 윈도우 사용자 그룹(천주석, 안성욱 외)에 있으므로 저작권과 관련된 일체의 행동은 이들의 동의를 얻어야 함을 알려 드립니다.

편집자들:
Tim Bray (Textuality and Netscape)
tbray@textuality.com
Jean Paoli (Microsoft) jeanpa@microsoft.com
C. M. Sperberg-McQueen (University of Illinois at Chicago) cmsmcq@uic.edu

한국어 번역:
윈도우 사용자 그룹(천주석, 안성욱 외)
neozen@kornet.net
www.wug.or.kr
www.xmlkorea.org

요약(Abstract)
Extensible Markup Language (XML)은 SGML의 한 부분집합으로 이 문서에 완전하게 기술되어 있다. 이 언어의 목적은 HTML과 더불어 가능한 새로운 방식으로 일반적인 SGML을 웹 상에서 보내고, 받고, 처리할 수 있도록 하는 것이다. XML은 SGML 및 HTML 모두와 호환되며 쉽게 구현할 수 있도록 설계되었다.

이 문서의 지위(Status of this document)
이 문서는 W3C 회원들과 관련 기관들에 의해 감수되었으며 W3C 권고안(Recommendation)으로 승인되었다. 즉, 이 문서는 신뢰할 수 있고 레퍼런스 자체로 이용하거나 다른 문서의 기본 레퍼런스로서 인용될 수 있다는 것을 의미한다. 이 권고안을 만드는 과정에서 W3C의 역할은 이 스펙에 대하여 관심을 집중시키고 널리 쓰일 수 있도록 권장하는 것이다. 이러한 W3C의 역할은 결과적으로 웹의 호환성과 기능성을 향상시킨다. 이 문서는 기존의 널리 쓰이던 범국가적 텍스트 처리 표준(Standard Generalized Markup Language, 수정 및 개정된 ISO 8879:1986(E))을 World Wide Web에서 사용할 목적으로 부분집합을 구성하면서 생성된 문법들을 규정하고 있다. 이것은 W3C XML Activity의 산물이며 이 활동에 대한 자세한 내용은 http://www.w3.org/XML에서 살펴 볼 수 있다. 그 밖의 다른 기술 문서와 최근의 W3C 권고안들은 http://www.w3.org/TR에서 볼 수 있다. 이 스펙에서는 URI 용어를 사용하고 있다. URI 용어는 Berners-Lee 등에 의해 정의되었으며 현재 IETF RFC1738 과 IETF RFC1808을 업데이트하기 위한 작업이 진행중이다. 이 스펙에 대해 보고된 오류 목록은 http://www.w3.org/XML/xml-19980210-errata에서 볼 수 있다. 이 한국어판 문서에 대한 오류를 발견하면 천주석(neozen@kornet.net)에게 알려주기 바란다.

▲ TOP
1. 서론(Introduction)

Extensible Markup Language(약자로 XML이라 쓴다)은 XML 도큐먼트라고 불리는 데이터 객체들의 클래스를 기술하고, 일부 이 XML 도큐먼트들을 처리하는 컴퓨터 프로그램들의 행동을 기술한다. XML은 일종의 SGML 애플리케이션 또는 SGML(Standard Generalized Markup Language [ISO 8879])의 축약된 형태이다. 그 구성을 보면 XML 도큐먼트는 SGML 도큐먼트와 동일하게 하고 있다.
XML 도큐먼트들은 엔터티(entity)라고 불리는 저장 단위들로 구성된다. 엔터티는 파싱되는 데이터 또는 파싱되지 않는 데이터 중의 하나를 포함한다. 파싱되는 데이터는 문자들(character)로 구성된다. 이 문자들의 일부는 문자 데이터(character data)가 되고, 또 일부는 마크업(markup)이 된다. 마크업은 XML 도큐먼트의 물리적 저장소의 배치도 및 논리적 구조에 대한 설명을 부호화하게 된다. XML은 저장소의 배치도 및 논리적 구조를 강제하는 메커니즘을 제공한다.
XML 프로세서(XML processor)라고 불리는 소프트웨어 모듈은 XML 도큐먼트를 읽어 들여서 그 컨텐츠와 구조에 접근할 수 있도록 하는데 사용된다.
XML 프로세서는 응용프로그램(application)이라고 불리는 또 다른 소프트웨어 모듈의 일부로서 작동하는 것으로 가정된다. 이 스펙은 XML 프로세서가 'XML 데이터와 응용프로그램에 제공되어야 하는 정보를 어떻게 읽어야만 하는지'와 관련되어 XML 프로세서에 필수적으로 요구되는 행동에 대해서 기술한다.

1.1 기원과 목표(Origin and Goals)

XML은 1996년에 World Wide Web Consortium (W3C)의 지원 하에 구성된 (원래는 SGML Editorial Review Board이었던)XML Working Group에 의해 개발되었다. 이 그룹의 의장은 역시 W3C에 의해 조직된 (예전에는 SGML Working Group이었던) XML Special Interest Group에 참가하고 있던 Sun Microsystems의 Jon Bosak이었다. XML Working Group의 회원 명단은 부록에 적어 놓았다. Dan Connolly는 W3C와의 연락을 위한 WG의 중개인으로 봉사했다.

XML의 설계 목표는 다음과 같다.

· XML은 인터넷에서 바로 사용할 수 있어야 한다.
· XML 다양한 애플리케이션을 지원해야 한다.
· XML은 SGML과 호환되어야 한다.
· XML 도큐먼트를 처리하는 프로그램을 작성하기 쉬워야 한다.
· XML의 선택적 특징들의 수는 최소로 유지되어야 하고, 이상적으로는 전혀 없어야 한다.
· XML 도큐먼트는 사람이 읽을 수 있어야 하며 이치에 맞도록 명백해야 한다.
· XML 설계는 가능한 빨리 이루어져야 한다.
· XML 설계는 견고한 문법을 가지면서도 간결해야 한다.
· XML 도큐먼트는 생성하기 쉬어야 한다.
· XML 마크업을 간단 명료하게 만드는 것은 가능한 중요하게 고려하지 않는다.

연관된 표준들(문자들을 정의하고 있는 ISO/IEC 10646와 Unicode, 언어 식별 태그를 정의하고 있는 Internet RFC 1766, 언어의 이름 코드를 정의하고 있는 ISO 639, 그리고 국가 이름 코드를 정의하고 있는 ISO 3166)과 함께 이 스펙은 XML Version 1.0을 이해하고 이것을 처리하기 위해 컴퓨터 프로그램을 구축하는 데 필요한 모든 정보를 제공하고 있다.

이 XML 스펙은 이 안의 모든 내용과 법적인 주의 사항이 훼손되지 않는 한 자유롭게 배포될 수 있다.

▲ TOP
1.2 용어(Terminology)

이 용어는 이 스펙의 본문에 정의되어 있는 XML 도큐먼트들을 기술하는데 사용된다. 다음에 정의되어 있는 용어들은 이러한 정의들을 구성하거나 XML 프로세서의 행위를 기술하는 데 사용된다.

~할(일) 수 있다(may).
도큐먼트와 XML 프로세서는 ~을 하는 것이 허용된다. 그러나 기술된 데로 행동해야만 하는 것은 아니다.

~해야(이어야) 한다(must).
도큐먼트와 XML 프로세서는 필수적으로 기술된 데로 행동해야만 한다; 그렇지 않으면 오류가 된다.

오류(error)
이 스펙에 있는 규칙의 위반; 결과는 정의되어 있지 않다. 소프트웨어는 오류를 발견하고, 보고하고, 복구할 수 있다.

치명적 오류(fatal error)
XML 프로세서가 반드시 발견하여 응용프로그램에 보고해야 하는 오류. 치명적 오류를 발견한 후에 XML 프로세서는 또 다른 오류를 찾기 위해 계속해서 데이터를 처리할 수도 있고, 응용프로그램에 그 오류를 보고할 수도 있다. 오류에 대한 수정을 지원하기 위해 XML 프로세서는 도큐먼트의 처리되지 않은 (문자 데이터와 마크업이 섞여 있는)데이터를 응용프로그램이 이용할 수 있도록 할 수 있다. 그러나 일단 치명적 오류가 발견되면 XML 프로세서는 반드시 일반적인 처리를 계속 진행해서는 안 된다 (즉, 프로세서는 문자 데이터와 도큐먼트의 논리적 구조에 관련된 정보를 일반적인 방법으로 응용프로그램에 전달하는 것을 계속해서는 안 된다).

사용자 선택에 따라(at user option)
소프트웨어는 기술된 대로 작동해야만 하거나, 작동할 수도 있다(각 문장에 쓰인 동사가 어떤 것이냐에 의존한다); 만약 소프트웨어가 기술된 대로 작동한다면 소프트웨어는 반드시 사용자들이 기술된 이 행동을 사용 가능하게 하거나 사용 불가능하게 하는 수단을 제공해야만 한다.

유효성 강제(validity constraint)
모든 유효한(valid) XML 도큐먼트들에 적용되는 규칙. 유효성 강제의 위반은 오류가 된다;

문법 적합성 강제(well-formedness constraint)
모든 문법을 따르는(well-formed) XML 도큐먼트들에 적용되는 규칙. 문법 적합성 강제의 위반은 치명적 오류가 된다.

일치(match)
(문자열 또는 이름에서:) 두 개의 문자열 또는 이름이 반드시 동일한 것으로 비교되고 있다는 것을 말한다. ISO/IEC 10646에 있는 복수의 표현이 가능한 문자들(예를 들면, 미리 만들어져있는 형태와 밑+발음 부호 형태를 모두 갖는 문자들)은 두 문자열에서 동일한 표현을 가지는 경우에만 일치한다. 사용자 선택에 따라 프로세서들은 이러한 문자들을 몇 가지 기준 형태로 정규화할 수 있다. 어떤 대문자 변환(case folding)도 수행되지 않는다. (문법에 있는 문자열 또는 규칙에서:) 만약 하나의 문자열이 문법적 결과물에 의해 생성된 언어에 속하고 있다면, 이 문자열이 하나의 문법적 결과물과 일치하고 있다는 것을 말한다. (컨텐츠와 컨텐츠 모델에서:) 한 요소는 "요소 유효(Element Valid)"라는 강제에 기술된 방식을 따르고 있을 때 그 요소의 선언과 일치한다고 말한다.

호환 가능성을 위해(for compatibility)
XML의 특징은 XML이 완전히 SGML과 호환 가능한 채로 있어야 됨을 보장하는 것을 포함하고 있다.

상호 운용성을 위해(for interoperability)
강제적이지 않은 권장사항은, XML 도큐먼트들이 ISO 8879에 대한 WebSGML Adaptations Annex보다 앞서 개발되어, 이미 설치되어 있는 SGML 프로세서 기반에서도 처리될 수 있는 기회를 향상시키는 것을 포함하고 있다.

▲ TOP
 
<천랑의 주석>
용어의 정의
용어의 정의야말로 새로운 언어를 제대로 이해하기 위한 필수적인 요건이 됩니다. XML의 영역(보통 '도메인'이라는 표현을 사용하지요?)에 속한 용어들을 타 프로그래밍 언어나 실세계의 용어와 명확하게 구별하여 사용하는 습관을 들이는 것이 좋습니다. 물론, 많은 경우에 타 프로그래밍에서 사용하는 용어나 실세계의 용어가 XML 도메인에서도 그대로 적용되어 사용됩니다만 일부 용어들을 그렇지 않으니 주의하여 주시기 바랍니다.
먼저 위의 서론에 나와 있는 "XML 도큐먼트"의 정의를 주의해서 봅시다. 많은 XML 번역서에서 Document라는 용어를 그저 "문서"라고 번역합니다만 XML의 영역에서 Document는 좀 다른 의미를 갖습니다. 일반적으로 우리가 문서라고 함은 "워드 프로세서나 에디터, 또는 직접 손에 의해 작성된 유의미한 문자 데이터를 갖는 모든 형식의 정보의 집합"을 일컫는 지극히 불확실하고 막연한 개념입니다. 하지만 XML 1.0 스펙에서는 "데이터 객체들의 클래스"를 XML Document라고 부른다고 명백히 정의하고 있습니다. 여기서 말하는 XML Document를 "XML 도큐먼트(Beginning XML)" 또는 "XML 문서"의 어느쪽으로든 번역할 수 있겠으나 우리가 일반적으로 말하는 막연한 개념의 "문서"가 아니라 훨씬 제한적인 의미를 갖는 좀 더 단순한 개념(데이터 객체들의 클래스)이라는 사실은 명심해 두었으면 합니다.

용어를 명확히 정의하지 않아서 생기는 오해와 잘못된 내용 전달이라는 의사소통의 문제가 많은 경우에 시간과 비용의 엄청난 낭비를 가져오는 원인이 됩니다. 그렇기 때문에 개발자들 사이에서는 "여러가지 의미를 갖는 말"로 인한 의사소통의 문제를 해결하기 위해 명확하게 정의된 새로운 의사소통 언어를 사용하는 것이 바람직한 방법론이 되어 가고 있습니다. 이러한 의사소통의 언어로 대표적인 것이 UML(Unified Modelling Language)이며 이 언어는 다양한 그림과 기호들을 사용하여 시스템을 설명함으로써 여러가지 의미를 갖는 말을 통해 의사소통을 할 때보다 훨씬 쉽게 의사소통을 가능하게 합니다.
이러한 도구를 사용하면 프로그래밍 언어를 모르는 분석가와 프로그래머도 실생활의 언어와 프로그래밍 언어의 매개가 되어주는 이러한 언어를 사용하여 서로 오해없이 의사 전달이 가능해져서 결국 시스템이 오류가 적고, 요구사항을 잘 반영한 완성도가 높은 시스템의 구축이 가능해지는 것입니다.

이 부분의 스펙은 대부분이 용어의 정의와 관련된 내용이므로 꼼꼼하게 잘 읽어 두시기 바랍니다. 그리고 앞으로도 용어의 정의는 중요하게 다룰 예정이니 새로운 용어가 등장할 때마다 잘 기억해 두도록 합시다.

참 고
XML은 아직도 진화를 거듭하고 있는 언어입니다. 항상 XML과 관련 기술들의 동향에 주의를 기울이도록 합시다. 다음 강좌 때까지 W3C의 홈페이지(WWW.W3.ORG)에 들러서 XML과 관련 기술들의 동향을 살펴보면 좋겠네요.
다음 강좌부터는 본격적으로 XML에 대해 알아보도록 하죠. 그럼 다음 강좌에 뵙겠습니다. 천랑 ^^

 

저작권 정보

 

본 강좌는 Prentice Hall 출판사의
"XML: The Annotated Specification"을 일부 참고하였음을 밝힙니다.

본 강좌에서 사용하고 있는 XML 1.0 스펙의 한국어 번역본은 윈도우 사용자 그룹에 그 저작권이 있으며, 이 스펙 전체가 단 한 구절도 훼손되지 않는 경우에 한하여 배포될 수는 있으나 기타 상업적인 목적으로의 전재 및 인용은 금합니다.

본 강좌의 저작권 또한 윈도우 사용자 그룹에 있으며 무단 전재 및 인용을 금합니다

XML의 세계에 입무하기 전에 간단하게 HTML의 한계
XML이 등장한 배경에 대해 살펴보도록 합시다.

1. HTML 의 한계
1992년에 HTML 스펙 1.0 이 발표된 이후 오늘날의 인터넷 혁명을 가능하게 한 상당히 성공적인 언어인 HTML에게도 다음과 같은 한계들이 존재하고 있습니다. 결국 이러한 한계들이 새로운 마크업 언어에 대한 필요성을 고려하게 만들게 된 것이지요. 그럼 HTML이 근본적으로 갖고 있는 한계를 살펴보도록 합시다.

  • 유효하지 않은 HTML
    벤더들마다 나름대로 특화된 확장을 도입, 웹브라우저간, 플랫폼간의 동질성을 유지하기 어렵다.

  • 깨어진 링크
    웹 페이지가 지워지거나 다른 호스트로 옮겨졌을 때 그 페이지에 대한 모든 URL 참조자들은 유효하지 않다.(링크가 자주 깨진다.)

  • 고정된 문법
    TML의 요소와 속성들의 집합이 고정되어 있어서 HTML은 고정된 문법체계를 갖는다고 한다. 새로운 응용프로그램이나 새로운 웹 기술들을 다루는데 적합하지 않다.

  • 메타데이터에 대한 제한된 지원
    검색 엔진들이 원본 도큐먼트에 관한 주요한 정보들을 뽑아낼 수 있는 방법이 제한 되어 있다.

  • 구조화된 태그의 부재
    HTML이 구조화된 태그들(예를 들면 , 또는 <DIV>과 같은) 을 지원함에도 불구하고 대부분의 웹 응용프로그램과 웹 저작자들은 이러한 가능성을 무시하고 단지 도큐먼트의 시각적 레이아웃을 제어하는데만 사용하고 있다. 이러한 비구조화된 접근은 문서의 트리를 따라서 검색하는 것을 어렵게 한다.

  • 데이터 교환의 어려움
    HTML의 제한된 태그 모임들이 웹 상에서 정보를 표현하는 목적으로 설계되었기 때문에 태그로 묶인 데이터 필드에 따라 데이터를 뽑아내는 것이 거의 불가능하다.

  • 현대적 특징들의 부재
    어떤 표준을 따르더라도 현대적인 많은 기술들에 부합하기 어렵다.

  • ▲ TOP
    2. XML 의 등장
    XML은 결코 새로운 마크업 언어가 아닙니다. 이미 1980년대 초반에 미국무성에서 군사적 목적으로 만들어진 GML(General Markup Language)로부터 비롯하여 1986년에 ISO의 표준이 되어 산업계 전반의 광범위한 문서화 작업을 위해 GML로부터 확장된 SGML(Standard General Markup Language)은 그로부터 거의 20년간이나 널리 사용되어 왔습니다. 따지고 보면 HTML도 그 시작은 유명한 물리학 연구소인 CERN에서 과학자들 사이의 연구 성과를 쉽게 공유하기 위해 만든 SGML 조각에 불과하였으며, XML도 SGML과는 완벽한 호환성을 유지하면서 인터넷에 더욱 적합하게 발전시킨 SGML의 한 부분집합이라고 볼 수 있습니다. 그렇지만 XML은 SGML보다 훨씬 간단하고 견고한 규칙을 갖게 재구성함으로써 결과적으로 관련 도구들을 더욱 값싸게 개발하고 인터넷에 더욱 잘 들어맞게 된 것이죠. 이런 점들이 결과적으로 XML을 쉽게 채택할 수 있도록 하였고, 관련 기술들이 활짝 꽃피게 되는 계기를 마련하게 된 것입니다.
    SGML과 XML의 간략한 장점은 다음과 같습니다.

  • SGML/XML 이 갖는 강점
    • 좀 더 유효하게 입력되는 것을 허용하고 데이터 엔트리를 쉽게 만들고 좀 더 읽기 쉽게 만듦으로써 원본 도큐먼트의 질이 향상될 수 있다.
    • 도큐먼트들이 더 합리적으로 유지 보수 될 수 있으며, 결과적으로 라이프 사이클이 향상된다.
    • 인쇄/출판 비용이 감소한다.
    • 정보의 재사용이 쉬워지므로 도큐먼트의 가치를 증가시킨다. (SGML/XML로 만들어진 문서들은 하이퍼텍스트처럼 표현되어 출력되거나 저장될 수 있고, 데이터베이스를 통해 접근될 수 있다.

  • XML의 등장
    • 너무 제한적인 HTML의 한계와 표준화된 DTD 없이는 너무 복잡한 SGML의 사이에서 고안된 SGML의 부분집합. 흔히들 XML은 SGML의 90%에 육박하는 가능성을 지니고 있으며 복잡성은 SGML의 단지 10%만을 갖고 있는 기술이라고 얘기한다.

  • XML의 특징
    • 확장성(Extensibility) : 어떤 문서 객체(instance)를 위하여 새로운 요소와 속성을 정의 가능케 하는 것
    • 깊은 구조화 가능성 : 인위적인 중첩을 허용하는 것
    • 유효성 : 사용전 데이터의 검사

    자, 이제 HTML이 좀 문제가 있다는 점과 XML이 이러한 문제점들을 고려해서 만들어 지게 된 역사적 필요성에 대해 어렴풋이나마 이해하셨나요? 그러면 이제 본격적으로 XML 스펙 읽기에 들어가보도록 합시다.

  • 저작권 정보


    본 강좌는 Prentice Hall 출판사의
    "XML: The Annotated Specification"을 일부 참고하였음을 밝힙니다.

    본 강좌에서 사용하고 있는 XML 1.0 스펙의 한국어 번역본은 윈도우 사용자 그룹에 그 저작권이 있으며, 이 스펙 전체가 단 한 구절도 훼손되지 않는 경우에 한하여 배포될 수는 있으나 기타 상업적인 목적으로의 전재 및 인용은 금합니다.

    본 강좌의 저작권 또한 윈도우 사용자 그룹에 있으며 무단 전재 및 인용을 금합니다

    ## 자료출처 : Devpia XML 게시판의 김병희 님의 자료를 무단 -_- ;; 복사 ;



    1.DOM(Document Object Model)문서개체모델

    원래 DOM 이란 플렛폼과 언어에 구애받지 않는 인터페이스를 말합니다.

    웹 컨텐트와 구조, 문서 스타일에 접근하여 동적으로 변경할 수 있도록 합니다.

    그럼 실질적인 의미의 DOM이란 무엇일까요..

    W3C에 의해 개발되고 있는 프로그래밍 인터페이스 규격인 DOM은,

    프로그래머가 HTML 페이지나 XML 문서들을 프로그램 객체로 만들거나 수정할 수 있도록 해줍니다.

    현재로서, HTML과 XML은 그저 데이터 구조의 형태로 문서를 표현하는 방법일 뿐입니다.

    이러한 문서들은 마치 프로그램 객체처럼, 자신들의 콘텐츠나, 객체 내에 감추어진 데이터를 가질 수 있게 됨으로써,

    문서를 조작할 수 있는 콘트롤을 보장하는데 도움을 줄 수 있게 합니다.

    문서들은 객체들과 마찬가지로,메쏘드라고 불리는 객체지향 프로시저들을 함께 가지고 갈 수 있습니다.

    그럼 XML DOM을 어떻게 사용할까요.

    XML 파서의 인스턴스를 만들어 XML DOM을 사용합니다.

    이것을 가능하게 하기 위해 Microsoft에서는 Msxml.dll의 표준 COM 인터페이스 집합을 통해 XML DOM을 제공합니다.

    Msxml.dll에는 XML 문서 작업을 위한 형식 라이브러리와 구현 코드가 들어 있습니다.

    Internet Explorer에서 실행되는 VBScript와 같은 스크립팅 클라이언트로 작업하는 경우에는 CreateObject 메쏘드를 사용하여 Parser 개체의 인스턴스를 만드는 방식으로 DOM을 사용합니다.

    ASP(Active Server Page)에서 VBScript를 사용하는 경우에는 Server.CreateObject를 사용합니다.

    Set objParser = Server.CreateObject( "Microsoft.XMLDOM" ) 

    이것은  많이 보셨죠..? 정리 하자면 CreateObject 메쏘드를 사용해서 인스턴스를 만들어서 DOM 을 사용하는 것이죠.

    MSDN에 가보시면 예제와 설명이 풍부하게 나와 있습니다.

    꼭 참고 하세요.

    2. 객체(Object)와 인스턴스(instance)

    프로그래머의 관점에서 말씀 드리면 객체는 어떤 실행을 하게될 코드의 집합입니다.

    인스턴스화는 객체에 대해 특정한 변형을 정의하고, 이름을 붙인 다음,

    그것을 물리적인 어떤 장소에 위치시키는 등의 작업을 통해, 인스턴스를 만드는 것을 의미합니다.

    정리 하자면 지하에 어떤 장소가 있다고 칩시다. 그 장소에는 작동할 수 있는 기계가 있구요.

    그 장소에 들어가기 위해서는 통로가 있어야 겠지요. 그 통로를 만들고 그 장소에 들어가면 기계를 작동 할 수가 있습니다.

    그 기계가 객체 이고 그 통로를 인스턴스라고 비유 할 수 있습니다.

    CreateObject( "Microsoft.XMLDOM" )가 이제 이해가 가시죠. CreateObject를 이용 인스턴스를 만들고 Microsoft.XMLDOM 를 사용하는 겁니다.

    그리고 다 사용하고 난 다음에는 통로를 닫아 줘야 겠죠. 그렇지 않으면 통로는 계속 열려 있을테니까요.

    set abc = noting 이 바로 인스턴스를 닫아 주는 겁니다.

    이제 인스턴스, 객체, dom 등이 이해가 가시나요?

    참고로 저는 용어에 대한 설명을 얻기 위해서 텀즈 사이트와 MSDN사이트를 자주 갑니다..
    개념 파악에 확실히 도움이 되니까 여러분들도 자주 가셔서 정보 얻으세욤...

    'Web(웹) Study > XML & XSL' 카테고리의 다른 글

    [1 부] 제 2 강 : XML 1.0 스펙의 소개 - 기원과 목표,  (0) 2007.11.20
    XML 1.0 스펙을 보기 전에  (0) 2007.11.20
    XML과 CSS, XSLT  (0) 2007.11.20
    자바가 바라보는 XML  (0) 2007.11.20
    XML Schema  (0) 2007.11.20

    ## 자료출처 ~ Devpia XML 게시판 김병희 님 자료를 -_- 무단으로 복사해왔습니다 ;;


    XML과 CSS, XSLT

    저번 시간에는 XML를 본격적 으로 배우기 전에 기본적으로 숙지해야할 개념 들에 대해
    알 아 보았다. 간단하게 복습해 보자. 우선 문서(document)에 대해 이해 했다. 즉 문서
    의 구성요소가 의미와 내용 그리고 구조 라고 했었다. 그리고 마크업 언어는 그런 문서
    를 표현해 주기 위한 기호들의 규칙의 집합이라고 했었다. 이 두가지를 이해 했다면 일
    단 성공이다. 오늘은 ‘마크업 언어로 작성된 코드 즉, 태그 들을 어떻게 브라우저가 스
    크린 상에서 보여주는가?’ 에 대한 대답의 내용으로 강좌를 하려고 한다. 오늘 배워야
    할 용어는 CSS와 XSLT이다.


    1.CSS(cascading style sheets)
    HTML은 학자들이 쓴 논문의 내용을 구조화 하여 보여주기 위해 처음 고안된 마크업 언어
    라고 저번에 설명 했었다. HTML소스는 보여주려는 내용과 그 내용을 어떻게 표현 할 것
    인가를 나타내는 태그로 구성된다. 물론 동적인 웹페이지의 경우 스트립트 소스와 ASP등
    의 소스들이 서로 섞여 있지만 여기서는 일단 HTML만 생각하자.

    여러분이 초기에 마크업 언어를 만든 개발자라고 하자. 그리고 논문을 웹페이지에 보여
    주려고 한다. 그러면 다음 문제를 생각 하지 않을 수 없을 것이다.
    즉 논리적 구조를 바탕으로 도큐먼트를 만드는 대신에 요소의 위치를 어떻게 잡을 것인
    가, 글자(폰트)를 무엇으로 할 것인가, 색을 무엇으로 바꿀까 하는 문제들 이다.
    한마디로 표현해 웹상에서 어떻게 가시적으로 보여줄 것인가 하는 문제인 것이다. 어떻
    게 이쁘게 어떻게 눈에 띄도록 하는 것들이 그런것이다.

    그래서 고안된 것이 CSS이다. 이제 CSS에 대해 간략히 정리하자.
    ‘CSS는 만들어진 도큐멘트를 어떻게 디스플레이(표현-presentation) 할 것인지 대한 스
    타일 시트이다.’

    웹브라우저에서 어떤 문서를 보여주기 위해 필요한 것은 보여줄 문서의 내용과 그 내용
    에 대한 구조를 나타내는 마크업언어인 HTML, 그리고 그것들을 웹브라우저에서 표현해
    줄 스타일 시트가 필요하다. CSS는 물론 HTML태그가 어떻게 표현될것인지를 정해주는 것
    이다. 그러므로 HTML로 작성되지 않은 순수한 문서에 CSS를 적용시키는 것은 말이 성립
    되지 않는다. HTML 태그가 있음으로 해서 CSS가 있는 것이다.!

    CSS는 HTML 코드 안에 삽입 되거나 따로 *.CSS라는 확장자로한 파일로 저장되어 있다.
    Text/css란 코드를 본적이 있을 것이다. *.CSS라는 파일명이 삽입된 HTML코드를 본적도
    있을 것이다. 즉 ‘다음 HTML코드를 *.CSS파일에 정의된 대로 웹브라우저에서 보여 주어
    라’하는 뜻이다. 물론 이것을 해석하는 엔진은 당연히 브라우저 안에 있다.
    여기서 잠깐 헷갈려 하는 사람들을 위해 서버에서 클라이언트로 오는 데이터가 무엇인
    지 설명해야겠다.


    클라이언트가 서버에서 요청하는 파일은 모두 HTML코드로 되어있다. ASP등의 서버쪽 언
    어들은 서버 측의 ASP엔진에서 이미 해석되고 순수한 HTML코드 데이터만 클라이언트로
    오게 되는 것이다. 그리고 클라이언트의 웹브라우저에서 그 태그들을 해석하여 웹페이지
    에 나타내는 것이다. 자바스크립트 또한 웹브라우저안에서 해석된다.
    시간 날 때 서버측 언어와 클라이언트측 언어에 대해 설명할 기회가 있을 것이다.  
    이제 CSS에 대해 이해가 가는가? 그럼 다음을 보자.




    2.XSLT(Extensible Stylesheet Language for Transformations)
    우리가 공부하고자 하는 것은 XML이다. 그런데 자꾸 HTML에 대한 설명을 집어 넣는 이유
    는 우선 HTML을 조금 이라도 아는 분들이 XML을 배우려고 하지 전혀 모르는 사람이 XML
    을 배우려고 하지는 않는다는 것이다. 그러기 때문에 HTML에 대한 설명을 XML에 대한 설
    명을 위해 집어 넣는 것이다.


    그럼 이제 본격적으로 XSLT에 대해 알아 보자.
    XSLT에 대해 이해하기 전에 스타일 시트에 대해 어떤 질문이 생겨야 한다. XML도 어차
    피 마크업 언어 이고 XML태그를 웹상에서 표현해 주려면 CSS가 필요해야 한다. 그런데
    처음 강좌에서 XML의 강력한 장점 중의 하나가 사용자가 마음대로 태그를 만들 수 있다
    는 것이었다. 이제 본격 적인 질문이다. 사용자 마음대로 태그를 만들어 버리면 브라우
    저가 어떻게 그 태그를 해석해서 웹페이지에 보여준다는 것인가? 대답부터 말하면 웹브
    라우저는 ‘전혀 모른다’ 이다. HTML에 쓰이는 태그는 HTML 스펙에 따라 정의되어 있
    고 브라우저는 그 스펙에 대한 정보를 포함하고 있기 때문에 즉 정해진 태그는 얼마든
    지 해석해서 보여 줄 수 있다. 하지만 XML의 경우 당연히 보여 줄 수 없다. 따라서 스타
    일 시트를 쓰지 않고 XML파일을 작성하고 웹상에 출력해 본다면 파일 그대로 보여주게
    된다.

    즉 XML 문서를 웹상에서 디스 플레이 하려면 당연히 스타일 시트가 있어야 한다. 물론
    CSS를 쓴다. 하지만! 정해진 대로 어떤 태그를 어떤 식으로 디스 플레이 할 필요는 없다
    는 것이다. 만약 <안녕>이라는 태그(XML에서는 요소라 부른다)를 사용한다면 CSS에서 <
    안녕>태그에 포함된 내용은 어떻게 보여주라고 지정할 수 있다는 말이다.
    XML에서는 이것을 <?xml-stylesheet ?>라는 처리 지시문을 통해 정해 준다.


    이제 XSLT에 대해 파고 들어 보자.
    XML도 충분히 CSS를 이용해서 웹상에서 디스플레이 해 줄 수 있다고 했다. 근데 굳이 다
    른 스타일 시트를 쓰려는 이유는 무엇일까?
    ‘XSLT는 XML문서를 텍스트를 기반으로 하는 다른 XML뿐만 아니라 어떤 다른 형식으로
    도 변환 하는 것을 가능하게 한다’ transformation이라는 단어가 ‘변환’이라는 뜻을
    가지고 있다는 것을 명심하자.

    즉 XSLT는 XML변환 언어이다. XML는 순수하게 문서의 데이터 구조만을 나타낸다. 그리
    고 XML의 강력한 장점 중의 하나가 서로 다른 플랫폼의 서로 다른 어플리케이션과 상관
    없이 쓸 수 있다는 것이었다. 이것을 이식성이 강하다고 말하는데 XML을 다른 웹상 뿐
    만 아니라 다른 어떤 어플리케이션에 나타내고자 할 때 즉 XML을 다른 용도를 사용하고
    자 할 때 XSLT를 사용한다.


    정리하자면 하나의 XML문서가 있다면 이것을 가지고 이 XML문서를 사용하고자 하는 각각
    의 어플리 케이션이 그 어플리케이션에 맞게 표현할 XSLT를 이용하여 표현 할 수 있다.
    물론 각각의 경우 적용할 XSLT는 다를 것이다.
    XSLT변환을 하기 위해 필요한 것은 XML문서, XSLT스타일 시트 그리고 XSLT엔진 이다.
    HTML의 경우 웹브라우저에 자체 해석 엔진이 있다고 했다. 물론 CSS해석 엔진도 포함된
    다. XML의 경우도 웹브라우저에 당연히 엔진이 있어야 한다.
    MSXML라고 본적이 있을 것이다. 어디 가서 MSXML3.0 또는 4.0을 깔아야 한다고 다운로
    드 주소까지 친절하게 나와있는 사이트를 보았을 것이다. 이것이 쉽게 말해 XML해석 엔
    진이다. 이쪽 업계에서 이것을 파서라고 부른다. MSXML은 IE(Internet Explorer)에 장착
    된 XML파서로서 XSLT엔진 또한 포함하고 있다.
    이제 XSLT에 대해 이해가 가는가…?


    다음 시간에는 XSLT예제와 직접 실습해 보도록 하겠다. 그리고 특히 전자 상거래 에서
    왜 XSLT가 중요한지에 대한 설명과 그 예도 들어 보도록 하겠다.

    'Web(웹) Study > XML & XSL' 카테고리의 다른 글

    XML 1.0 스펙을 보기 전에  (0) 2007.11.20
    [XML xpert 5]객체, DOM, 인스턴스란 무엇인가..  (0) 2007.11.20
    자바가 바라보는 XML  (0) 2007.11.20
    XML Schema  (0) 2007.11.20
    XSL, XLL  (0) 2007.11.20

    + Recent posts