XSLT가 비교적 생소했던 10년 전, 필자는 XSLT를 이해하려고 전력을 다했다. XSLT는 사용하기가 너무 어려웠으며 디버그하기도 매우 힘들었다. 그러나 XSLT의 강점과 약점 그리고 더욱 중요한 패러다임, XSLT를 사용하는 방법과 시점을 이해하게 되면서 XSLT는 필자가 즐겨 사용하는 도구가 되었다. XSLT는 XSLT에 적합한 태스크에 잘 적용할 때 매우 강력하고 유용한 도구가 된다.
볼트에서 너트를 풀기 위해 드라이버와 망치를 사용한 적이 있는가? 드라이버 날을 육각 너트의 한쪽 면에 대고 망치로 드라이버의 손잡이를 두드린다. 드라이버가 회전함에 따라 너트도 함께 돌아간다. 드라이버가 회전하지 않으면 드라이버 손잡이를 더 강하게 두드린다. 이제 소켓 렌치를 사용하는 경우를 생각해 보자. 소켓 렌치는 망치처럼 작아 보이지만, 실제 망치를 사용하는 것만큼 효과적이지는 않다. 그래도 망치와 드라이버를 내려놓고 너트 위에 소켓을 대고 돌린다. 불행히도 소켓이 너무 큰 경우에는 소켓이 너트에 밀착되게 해야 한다. 결국, 소켓 렌치를 사용하는 것을 포기하고 다시 망치를 사용하게 된다.
소켓 렌치를 사용할 때의 성공 요인은 소켓이 너트와 일치해야 한다는 패턴 일치에 있다. 소켓이 너트와 일치하는 경우, 볼트에서 너트를 풀기에는 망치보다는
소켓 렌치가 훨씬 더 효과적이다. 또한, XSLT는 패턴에 의존하는 패턴 일치 언어인 반면에 Java™와 C# 언어는 명령형 언어이다. XSLT를 소켓 렌치라고 하면,
필수 언어는 망치라고 할 수 있다. 이러한 언어에는 각각 적합한 용도가 있다.
웹 개발을 하려면 매우 다양한 언어를 익혀야 한다. 물론, 그 첫 번째는 마크업 언어인 HTML이다. 그 후에는 프론트 엔드 언어로 CSS와 Javascript를 배우고
PHP나 Microsoft® ASP.NET과 같은 서버 스크립트를 익힌다. 백엔드 언어로는 Java, C#이나 Microsoft Visual Basic.NET과 같은 언어를 습득한다. 마지막으로
데이터베이스 레벨에서는 SQL을 배운다. SQL을 아는 경우에는 두 언어가 모두 선언형 언어이기 때문에 XSLT를 배우기가 수월해진다.
대부분의 프로그래머와 마찬가지라면 독자도 C++과 같은 명령형 언어로 일을 시작했을 것이다. 이러한 언어는 명령으로 코딩되며 함수가 조치를 수행한다. 함수의 이름은
동사-명사 형태를 취한다(예: GetValue나 UpdateContactInfo). 선언형 언어는 명령을 실행한다기 보다는 원하는 결과를 명시하거나 선언한다. 표 1에는 명령형 언어와
선언형 언어로 분류된 몇 가지 일반적인 프로그래밍 언어가 표시되어 있다.
표 1. 프로그래밍 언어 스타일
| 명령형 | 선언형 | ||
|---|---|---|---|
| 절차형 | 오브젝트 지향형 | 함수형 | 논리형 |
C, Pascal | Java, C++ | LISP, XPath | Prolog, SQL, XSLT |
XSLT는 XML을 XML이나 HTML, 평문으로 변환하는 데 필요한 선언형 언어이다. 변환은 템플리트가 선택된 입력 XML에 있는 패턴을 출력할 내용과 일치시키는 과정을 통해 이루어진다. 그림 1에서와 같이 핵심은 패턴 일치이다. 명령을 코딩하는 대신 패턴을 코딩한다. 일부 패턴은 입력과 일치하고 다른 패턴은 출력 템플리트로 작동한다.
목록 1에는 <item> 요소와 일치하는 단순한 XSLT 템플리트가 표시되어 있다.
목록 1. XSLT 템플리트 예제
<xsl:template match="item">
<li><a href="{link}"><xsl:value-of select="title"/></a></li>
</xsl:template>
|
match 속성은 입력과 일치하는 패턴(이 경우에는 <item> 태그)을 지정한다.
<xsl:template> 태그 사이에 있는 마크업은 출력 템플리트이다. 이 템플리트에는 플레이스홀더가 있으며 여기에서 입력값이 대체된다. 목록 1에서는 <link> 요소의 값이
URL을 href 속성에 제공하며 <title> 요소는 표시되는 하이퍼링크 텍스트에 해당한다.
개발자는 가끔 "RSS 피드를 링크 목록으로 표시하는 작업"과 같은 태스크를 맡게 된다. 그림 1에서 최종 제품의 모습을 상상할 수 있다.
그림 1. 렌더링된 출력
그러나 바로 코딩을 시작하게 되면 소켓의 크기가 맞지 않는 소켓 렌치를 사용할 때와 같이 좌절하게 된다. 코딩을 시작하기 전에 자신에게 다음과 같은 두 가지 질문을 하자.
- 무엇을 갖고 있는가(입력)?
- 무엇을 하고 싶은가(출력)?
입력에 대한 질문에 답변을 할 때는 다음과 같은 질문을 고려한다.
- XML은 어떤 모습을 하고 있나?
- 요소는 무엇인가?
- 어느 것이 반복 가능한가?
- 구조란 무엇인가?
- 속성이란 무언인가?
- 네임스페이스란 무엇인가?
그림 2에는 XML 구조의 일반적인 용어가 표시되어 있다.
그림 2. 일반적인 XML 용어
입력 XML 샘플을 가져온다. 사용 가능한 경우에는 스키마도 가져온다. 스키마에는 선택적인 요소와 속성은 물론이고 가능한 모든 태그와 속성값, XML 문서의 구조에 대한 정보가 포함되어 있다. XSLT를 테스트하고 디버깅하고 패턴을 일치시키는 과정을 코딩하는 데는 샘플 입력 문서가 반드시 필요하다. 예를 들어, 목록 2에 있는 IBM® developerWorks® 기술 라이브러리 RSS 피드를 생각해 보자.
목록 2. 입력 XML 문서 샘플
<?xml version="1.0"?> <rss version="2.0"> <channel> <title>IBM developerWorks : Technical library</title> <link>http://www.ibm.com/developerworks/</link> <description>The latest content from IBM developerWorks</description> <pubDate>27 Nov 2010 16:48:48 +0000</pubDate> <language>en</language> <copyright>Copyright 2004 IBM Corporation.</copyright> <image> <title>developerWorks</title> <url>http://www.ibm.com/developerworks/i/dwlogo-small.gif</url> <link>http://www.ibm.com/developerworks/</link> </image> <item> <title><![CDATA[IBM Cognos Proven Practices: Enterprise Planning - User Lockdown in DB2]]></title> <description><![CDATA[This document describes methods to limit database permission in DB2 for IBM Cognos Planning 8.]]></description> <link><![CDATA[http://www.ibm.com/developerworks/data/ library/cognos/infrastructure/databases/page535.html?ca=drs-]]></link> <pubDate>25 Nov 2010 05:00:00 +0000</pubDate> </item> <item> <title><![CDATA[Monitoring in DB2 9.7, Part 2: Relational access to XML event monitor data in DB2 9.7]]></title> <description><![CDATA[Learn how you can get relational access to the subset of monitor data that is captured in the form of an XML document by an activity or statistics event monitor in IBM DB2 for Linux, UNIX, and Windows Version 9.7 (DB2).]]></description> <link><![CDATA[http://www.ibm.com/developerworks/data/ library/techarticle/dm-1011db2mpart2/index.html?ca=drs-]]></link> <pubDate>24 Nov 2010 05:00:00 +0000</pubDate> </item> </channel> </rss> |
입력에 대한 개념이 제대로 되어 있으면 완료된 제품이 어떠한 형태를 갖추어야 하는지에 마음을 돌릴 수 있다. 자신에게 다음과 같은 질문을 해보자.
- 출력의 형식이 XML과 HTML, 텍스트 중에서 어떤 것이 되어야 하나?
- 태그 이름과 속성이란 무엇인가?
- 구조란 무엇인가?
XSLT는 둘 이상의 XML 문서를 다음 형식 중 하나로 변환한다.
- HTML
- XML, 다양한 어휘
- XML, 동일한 어휘(동일 템플리트 사용)
- XHTML(특별히 고려된 XML)
- XSLT(XSLT는 XML 어휘이지만, 네임스페이스 별명을 사용함)
- 텍스트(예: Javascript)
출력 마크업을 설계할 때는 먼저, 출력이 어떤 형태가 되어야 하는지 생각해 본 다음, 다음 단계로 넘어가서 마크업을 작성한다. 예를 들면, 목록 3에는 하이퍼링크 목록을 처리하는 HTML 마크업이 표시되어 있다.
목록 3. 원하는 출력
<html> <head><title>the title</title></head> <body> <ul> <li><a href="some-url">hyperlink text</a></li> <li><a href="some-url">hyperlink text</a></li> </ul> </body> </html> |
입력과 출력에 대한 질문에 답변하고 나면, XSLT를 작성할 준비가 된 것이다. 독자의 경험이 대부분 일반적인 프로그래밍 언어와 관련된 경우에는
"그래, 헤더를 작성하고 for 루프를 사용하여 목록을 생성한 다음, 푸터를 작성해야지"라고 생각할 수도 있다. 그 대신 패턴을 생각하자. 입력 <item> 요소는
출력 <li> 요소와 일치한다. 각 <item> 내에서는 <link> 요소가 <a href> 속성과 일치하며 <title> 요소는 <a> 태그 사이에 있는 텍스트와 일치한다. 이제 XSLT를 작성할 준비가 되었다. 다음 단계를 수행한다.
- 출력 형식은 HTML이므로 여기에는 HTML을 지정하는
<xsl:output>요소가 포함된다. - 루트 템플리트, 즉
<xsl:template match="/">를 추가하고 이 템플리트를 헤더와 푸터가 포함된 HTML 문서의 패턴으로 채운다. <xsl:apply-templates>요소를 해당 목록이 속하는 위치에 배치한다.<item>요소가 출력<li>요소와 일치하도록 템플리트를 작성한다.
목록 4에는 완료된 XSLT가 표시되어 있다.
목록 4. 완료된 XSLT
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
<html>
<head><title>Zen of XSLT</title></head>
<body>
<ul>
<xsl:apply-templates select="rss/channel/item"/>
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="item">
<li><a href="{link}"><xsl:value-of select="title"/></a></li>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
|
XSLT 코딩의 핵심은 함수를 호출하는 데 있지 않고 패턴을 일치시키는 데 있다. 다음과 같은 두 가지 핵심 질문에 대답해야 한다.
- 무엇을 갖고 있는가?
- 무엇을 하고 싶은가?
이러한 질문에 대답을 할 수 있으면, 입력과 출력을 일치시키는 XSLT 템플리트를 작성할 수 있다. 그렇지 않은 경우에는 소켓 렌치를 볼트에서 너트를 풀기 위해 드라이버 손잡이를 두드리는 망치로 사용하고 있는 것처럼 느끼게 될 것이다.
교육
- New to XML?: XML을 배우는 데 필요한 참고자료를 얻자.
- Extensible Stylesheet Language Transformations(XSLT): Transform XML documents to different forms by the W3C(developerWorks, 2007년 4월): XSLT에 관해 자세히 배우자.
- What kind of language is XSLT? (Michael Kay, developerWorks, 2005년 4월): XSLT의 유래와 전문 분야 및 XSLT를 사용해야 하는 이유를 배우는 대로 XSLT를 컨텍스트에 삽입해 보자.
- How an XSLT processor works(Benoît Marchal, developerWorks, 2004년 3월): XSLT를 다른 JSP, PHP 및 기타 웹 개발 언어와 비교하자.
- XML Path Language(XPath): Create expressions relating to portions of an XML document by the W3C(developerWorks, 2007년 4월): XPath 표준에 관해 자세히 배우자.
- Putting XSL transformations to work(Mark Colan, developerWorks, 2001년 10월): XSL 변환을 사용해서 이점을 얻을 수 있는 여러 가지 실제 비즈니스 시나리오를 살펴보자.
- Tip: How to combine documents with XSLT(Benoît Marchal, developerWorks, 2003년 5월): XPath 함수를 탐구하고 문서를 XSLT와 결합하는 방법을 배우자.
- developerWorks의 XML 영역: XML 영역에서 기술 향상에 도움이 되는 참고자료를 얻을 수 있다.
- My developerWorks: developerWorks와 관련된 경험을 개인화할 수 있다.
- IBM XML 인증: XML 및 관련 기술에 대한 IBM 인증 개발자가 되는 방법을 찾아볼 수 있다.
- XML 기술 자료: developerWorks XML 영역에서 다양한 기술 관련 기사와 팁, 튜토리얼, 표준 및 IBM Redbook을 볼 수 있다. 또한 더 많은 XML 팁을 읽어본다.
- developerWorks 기술 행사 및 웹 캐스트: 이러한 세션에 참가하여 최신 기술에 대한 정보를 얻을 수 있다.
- Twitter의 developerWorks 페이지: 오늘 가입하여 developerWorks 트윗을 팔로우하자.
- developerWorks
podcasts: 소프트웨어 개발자의 흥미로운 인터뷰와 토론을 확인할 수 있다.
- developerWorks on-demand demos: 입문자를 위한 제품 설치 및 설정 과정에서 숙련된 개발자를 위한 고급 기능의 활용에 이르기까지 다양한 데모를 제공한다.
제품 및 기술 얻기
- IBM 제품 평가판: IBM SQA Sandbox의 온라인 시험판을 다운로드하거나
살펴보고 DB2®, Lotus®, Rational®, Tivoli® 및 WebSphere®의 애플리케이션 개발 도구 및 미들웨어 제품을 사용해 볼 수 있다.
토론
- XML 영역 토론 포럼: 여러 XML 관련 토론에 참여해 볼 수 있다.
- developerWorks 커뮤니티: 개발자가 운영하고 있는 블로그,
포럼, 그룹 및 위키를 살펴보면서 다른 developerWorks 사용자와 의견을 나눌 수 있다.
Doug Domeny는 비즈니스 사용자에게 적합한, 브라우저 기반의 다국어 XML 편집기를 개발했으며 이 편집기는 XSLT, W3C XML Schema, DHTML, JavaScript, jQuery, 정규식 및 CSS를 사용하여 작성되었다. 그는 미국 매사추세츠주 웬햄에 있는 고든 대학에서 전산학과 수학 학사학위를 받았으며 수년 동안 XLIFF(XML Localization Interchange File Format) 및 OAXAL(Open Architecture for XML Authoring and Localization)과 같은 OASIS 기술 위원회에서 일했다. 소프트웨어 엔지니어로서는 소프트웨어 엔지니어링과 아키텍처, UI 설계 및 기술, 테크니컬 라이팅 분야의 중요한 기술을 개발했다.