한빛출판네트워크

IT/모바일

XML에서 특수문자를 위한 요소(Elements)의 사용

한빛미디어

|

2003-01-23

by HANBIT

저자: 앤소니 커츠(Anthony Coates) 재렐라 렌돈(Zarella Rendon) 역 김대곤

서론

이미 HTML에서는 수많은 특수문자를 제공하고 있다. 예를 들어 공백 입력에는 " ", copyright 기호에는 "©", 유럽의 새로운 통화인 유로의 기호 입력에는 "€"를 사용한다. 그러나 XML에서는 이와 같은 대부분의 기호들이 자동적으로 정의되지 않는다. 다시 말해 XML은 이를 제공하지 않는다는 이야기이다. 이러한 기호들을 사용하기 위해서는 기호들을 정의한 DTD를 사용하거나 문서 내에 있는 내부 DTD 섹션에서 이 기호들을 따로 정의해서 사용해야 한다. 둘 중 어떤 방식을 선택하든지 XML문서 안에 DOCTYPE 선언하는 것을 피할 수는 없다. DOCTYPE의 사용은 well-formed만을 필요로 하는 XML문서에서는 적합하지 않다. 이러한 경우 DTD는 효과없는 작업만 늘일 뿐이다.

특히 XML 유효성을 검사하는 몇몇 도구들은 자주 DOCTYPE 선언이 있다는 사실을 DTD를 이용하여 유효성을 검사해야 한다는 의미로 해석한다. 만약 유효성 검사를 위해 W3C의 XML 스키마를 사용하고 오직 특수문자를 사용하기 위해 DOCTYPE을 필요로 하는 경우에 문제가 발생하게 된다. 즉, 유효성 검사에서 예상치 못한 결과를 얻게 된다. 이러한 문제는 XML초보자에게 많은 시간적 낭비를 초래할 수 있는 문제 중에 하나다.

Xml-dev 메일링 리스트 최신판에서 W3C의 Core Working Group은 "XML은 특수문자를 제공하기 위한 새로운 매커니즘을 필요로 하지 않는다"는 의견을 표시했다. 그들은 "특수문자를 사용하기 바란다면, DTD에 정의하거나 내부 DTD섹션에서 정의하면 된다"고 말했다. 그러나 이에 대해 팀 브레이(Tim Bray)는 새로운 대안을 제시했다. "특수문자에 사람이 읽기 쉬운 이름을 부여하는 올바른 방법은 특수문자을 위한 요소(Element)를 만드는 것이다." 이러한 방법은 특수문자를 정의한 요소를 마지막에 처리해서 적합한 기호로 치환할 수 있도록 한다. 이러한 접근방식의 단점은 속성(Attribute)이 아닌 요소 (Element)의 내용(Content)으로 처리해야 한다는 것이다. 어쨌든 간에 이러한 방식은 DTD나 DOCTYPE이 필요없는 순수한 well-formed XML로 작업할 수 있도록 해준다.

Xmlchar XSLT library

앞에서 언급한 팀 브레이에 따르면 xmlcharHTML 4.0에 정의된 모든 특수문자에 대해 각각 XML 요소(Element)를 제공하는 XSLT 라이브러리이다. 예를 들어 아래의 파일은 영국 화폐 단위인 파운드 기호(£)와 유럽의 통화인 유로 기호(€)를 위한 xmlchar 요소를 포함하고 있다. 또 문장과 문장 사이에 두 칸의 공백을 입력하기 위해 공백문자를 사용했다.

    

My sandwich cost <ch:pound/>2.

Really?<ch:nbsp/> You were cheated.<ch:nbsp/> My sandwich only cost <ch:euro/>2.

xmlchar 스타일시트를 위 문서에 적용시켰을 때, 다음과 같은 html 파일을 결과로 얻는다. HTML이 이러한 기호를 삽입할 때 쓰는 "&pound;", "&euro;", "&nbsp;"을 포함하는 있는 올바른 HTML 파일이다.

  
    

My sandwich cost &pound;2.

Really?&nbsp; You were cheated.&nbsp; My sandwich only cost &euro;2.

xmlchar 스타일시트는 기존의 XSLT 스타일시트와 함께 사용될 수 있도록 설계되었다. 기존의 스타일시트에서 Html4-all.xsl의 내용를 사용하기 위해서는 간단하게 을 사용하면 된다. 문서 내에 모든 특수 문자 요소는 XSLT의 Output에서 알맞은 문자열로 바꾸어 질 것이다. 이러한 예제에 사용되어지는 스타일시트는 다음과 같다.

  <xsl:import href="xmlchar-1.1/html4-all.xsl"/>
  
  

  
  
  
  
  
  
    
  

  
  
  
    
  
  
    
    
      
        
      
      
    
  

xmlchar 요소의 보존

XML문서가 여러 단계의 처리과정을 거치는 동안 xmlchar 요소는 보통 최종 단계까지 보존될 것이다. 만약 사용자의 스타일시트가 디폴트 값으로 모든 요소를 복사하도록 설계되었다면 xmlchar 요소는 반드시 보존될 것이다.

만약 보존되지 않는다면 xmlchar 요소들을 입력(Input)에서 결과(Output)으로 복사하기 위해서 xmlchar "복사" 스타일시트를 임포트(import)해야 한다. 아래의 예제를 생각해 보자.

  
    xmlchar 1.0 - Test
  
  
    

xmlchar 1.0 Test

My sandwich cost <ch:pound/>2.

Really?<ch:nbsp/> You were cheated.<ch:nbsp/> My sandwich only cost <ch:euro/>2.

이 예제는 아래에 나오는 스타일시트를 이용하여 XHTML과 xmlchar가 결합된 형태에서 DocBook과 xmlchar가 결합된 형태로 바뀔 것이다. 그러나 DocBook과 XHTML은 동일한 요소들을 사용하지 않으므로, 스타일시트가 디폴트로 내용을 복사하도록 설정될 수 없다. 그래서 xmlchar의 내용은 명시적으로 매핑되어야 한다. 이것을 위해 xmlchar "복사" 스타일시트인 html4-all-copy.xsl이 스타일시트로 임포트되어야 한다.

  <xsl:import href="xmlchar-1.1/html4-all-copy.xsl"/>
  
  
    
    
<xsl:apply-templates select="/html/head/title/node()"/>
<xsl:apply-templates select="current()/node()"/>
결과는 다음과 같다.
xmlchar 1.0 - Test
xmlchar 1.0 Test My sandwich cost <ch:pound/>2. Really?<ch:nbsp/> You were cheated.<ch:nbsp/> My sandwich only cost <ch:euro/>2.
xmlchar 요소들은 보존되었다. 문서 처리의 후반부에서 xmlchar 요소들은 표준 DocBook 결과를 만들기 위해 해당되는 문자열로 바뀔 것이다.

문자 기호를 가진 기존의 문서의 변환

HTML4에서 지원하는 특수 문자열을 포함하는 기존의 XML 문서가 xmlchar를 사용하도록 변경하고자 한다면 xmlchar 특수 문자열 정의를 사용할 수 있다. 이러한 정의는 특수 문자열에 해당되는 xmlchar 요소를 전개시킨다.

주의: xmlchar의 특수 문자열 정의는 특수 문자열을 속성으로 포함하고 있는 XML문서에는 사용될 수 없다. 만약 특수 문자열을 속성으로 포함하고 있는 XML문서에 사용한다면 well-formed가 아닌 문서가 생성될 것이다.

아래의 특수 문자열을 포함하는 기존 문서를 생각해 보자. 이 문서는 이미 xmlchar 특수 문자열 정의가 임포트 되도록 수정되었다.
!ENTITY % html.4.entities
  SYSTEM "xmlchar-1.1/html4-all.ent">
%html.4.entities;
]>

  
    xmlchar 1.1 - Test
  
  
    

xmlchar 1.1 Test

My sandwich cost &pound;2.

Really?&nbsp; You were cheated.&nbsp; My sandwich only cost &euro;2.

파일이 파싱될 때, 특수 문자열이 xmlchar 요소로 전개될 것이다. 이러한 과정을 보기 위해 아래의 "copy-through" XSLT 스타일시트를 이용하여 파일을 변환해 보자.

  
  
    
    
      
    
  
  
    
  
  
    
    
      
        
      
      
    
  

결과는 다음과 같다.

  
    xmlchar 1.1 - Test
  
  
    

xmlchar 1.1 Test

My sandwich cost <ch:pound/>2.

Really?<ch:nbsp/> You were cheated.<ch:nbsp/> My sandwich only cost <ch:euro/>2.

특수 문자열들이 xmlchar 요소로 변환되었다.

결론

속성이 아닌 요소의 내용으로 작업하는 것만도 가능한 일이지만 특수 문자열을 위한 요소는 XML문서 안에서 특수 문자를 사용할 수 있는 자연스러운 방법을 제공한다. xmlchar XSLT 라이브러리는 HTML4가 지원하는 모든 특수 문자에 대응하는 요소를 제공한다.

참고도서

XSLT Cookbook (2003년 1월 수입예정도서)
TAG :
댓글 입력