· KLDP.org · KLDP.net · KLDP Wiki · KLDP BBS ·
Lib Xslt Tutorial

libxslt Tutorial

John Fleck

이것은 libxslt Tutorial 의 0.4 판이다.

Copyright (c) 2001 John Fleck

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license can be found [http]here.

목차

요약
libxslt 라이브러리를 이용한 XSLT 변환을 수행하여 XML 파일을 HTML 로 변환하는 간단한 응용프로그램을 작성하는 강좌.

1. 소개

확장 마크업 언어(XML: Extensible Markup Language)은 구조화된 데이터를 텍스트 형태로 교환하기 위한 World Wide Web Consortium 표준이다. 이것의 인기는 그 보편성에서 비롯한다. 어떤 컴퓨터든지 텍스트 파일을 읽을 수 있다. 적당한 도구로, 어떤 컴퓨터든지 다른 컴퓨터의 XML 파일을 읽을 수 있다.

이 도구들 가운데 가장 중요한 것의 하나로 확장 마크업 언어 변환(XSLT: Extensible Stylesheet Language Transformations)을 들 수 있다. XSLT 는 선언적인 언어로서 XML 파일을 스타일시트를 이용해 임의의 텍스트 출력으로 변환할 수 있게 해준다. libxslt 는 바로 이러한 변환을 수행 하는 함수를 제공한다.

libxslt 는 Daniel Veillard 가 그놈 프로젝트를 위해 작성한 자유 C 언어 라이브러리로 XSLT 변환을 하는 프로그램을 작성할 수 있도록 하기 위해 만들어졌다.

주의: libxslt 는 그놈 프로젝트의 후원 하에 작성되었으나, 어떤 그놈 라이브러리에도 의존하지 않는다. 이 강좌의 예제에도 사용하지 않았다.


이 강좌에서는 XML 파일을 읽어들여, 스타일시트를 적용하고 그 결과로 나온 출력을 저장하는 간단한 프로그램을 보기를 들어 설명한다. 이것은 당신이 만들고자 하는 프로그램은 아닐 것이다. xsltproc 이라는 libxslt 묶음에 포함된 프로그램이 똑같은 일을 하며 더 튼튼하고 완전한 기능을 구현하고 있다. 강좌를 위해 작성하는 프로그램은 xsltproc 을 벗겨내서 줄인 판으로 libxslt 의 기능을 보여주기 위해 고안되었다.

xsltproc 의 완전한 코드는 libxslt 배포본에 포함된 xsltproc.c 에 있다. 그것은 또한 [http]웹상에서도 볼 수 있다.

2. 기본 함수

XML 파일을 변환하기 위해서는, 세 가지 함수를 수행해야 한다:
  1. 입력 파일을 구문 분석
  2. 스타일시트를 구문 분석
  3. 스타일시트 적용

2.1. 구문분석 준비하기

입력 파일이나 스타일시트를 분석하기 전에, 엔티티를 다루기 위해 설정해야 하는 일련의 절차가 있다. 이 절차는 libxslt 고유의 것이 아니다. XML 파일을 구문분석하는 어던 libxml2 프로그램이든지 비슷한 절차를 거쳐야 할 것이다.

첫째, 일상적인 libxml 루틴을 호출해야 한다. xmlSubstituteEntitiesDefault 함수에, 정수값 1 을 넘겨서 libxml2 구문분석기에게 입력 파일을 구문분석 하는 동안 엔티티 지환을 하라고 알려줘야 한다. (0 을 넘기면 libxml2 에서 엔티티 치환이 일어나지 않는다.)

둘째, xmlLoadExtDtdDefaultValue 이 1의 값을 갖도록 해야 한다. 이것은 libxml 이 외부 엔티티 부분을 불러오도록 설정한다. 이것을 하지 않으면 입력 파일이 엔티티 일부를 외부에서 불러오도록 되어 있다면, 에러가 날 것이다.

2.2. 스타일시트 구문 분석

스타일시트 구문 분석은 하나의 함수 호출로 이러우지며, 이 함수는 xmlChar 꼴의 인자를 하나 받는다:

cur = xsltParseStylesheetFile((const xmlChar *)argv[i]);

여기서, 명령줄 인자로 넘겨받은 스타일시트 파일 이름을 to xmlChar 로 형변환했다. 함수가 돌려주는 값은 xsltStylesheetPtr 꼴로서 스타일시트 나무를 비롯한 스타일시트에 대한 정보를 가진 메모리상의 구조체이다. 그것을 직접 조작할 수도 있지만 이 보기에서는 그럴 필요가 없다.

2.3. 입력 파일 구문 분석

입력 파일 구문 분석은 하나의 함수 호출로 이루어진다:

doc = xmlParseFile(argv[i]);

함수가 돌려주는 값은 xmlDocPtr 라는 문서에 대한 정보를 담고 있는 메모리상의 구조체이다. 그것을 직접 조작할 수도 있지만 이 보기에서는 그럴 필요가 없다.

2.4. 스타일시트 적용하기

이제 메모리에는 문서와 스타일시트를 나타내는 트리 정보가 저장되어 있고, xsltApplyStylesheet 함수를 사용해서 문서에 스타일시트를 적용한다:

res = xsltApplyStylesheet(cur, doc, params);

이 함수는 앞의 두 함수 결과값인 xsltStylesheetPtrxmlDocPtr 인자를 받는다, 세번쩨 인자 params 는 XSLT 보조 변수를 스타일시트에 넘기는 데 쓸 수 있는 NULL로 끝나는 이름/값 쌍의 상수 문자열 배열이다.

2.5. 결과 저장하기

libxslt 는 결과 출력을 저장하기 위한 일련의 함수들을 포함한다. 이 보기에서는, xsltSaveResultToFile 이 쓰였으며, 결과를 stdout 에 저장한다:

xsltSaveResultToFile(stdout, res, cur);

주의: libxml 에도 xmlSaveFile 과 같은 출력 함수가 있어 이럴 때 쓸 수 있다. 그러나 libxslt 저장 함수 중 하나를 쓰지 않을 경우 스타일시트에 있는 출력과 관계돤 정보들, 이를테면 어떤 인코딩을 쓸지 선언하는 것 등을 잃게 된다.

2.6. 보조변수

XSLT 에서는 보조변수를 통해 추가적인 정보를 스타일시트에 넘길 수 있다. libxslt 는 XSLT 보조변수를 xsltApplyStylesheet에 넘긴 값들 중에 하나처럼 받는다.

강좌의 보기와 이 강좌 보기의 기반이 되는 xsltproc 에서는 넘기는 보조변수가 이름/값 쌍의 형태를 갖는다. 이 프로그램은 그것을 명령줄 인자로부터 수집하여 그것을 배열 params 에 삽입한 뒤 함수로 넘긴다. 배열의 마지막 원소는 NULL 값을 갖는다.

주의: 넘기는 인자가 노드가 아닌 문자열일 때, 반드시 escaped 야 한다. 이 강좌의 프로그램에서는, 다음과 같다: tutorial]$ ./libxslt_tutorial --param rootid "'asect1'" stylesheet.xsl filename.xml

2.7. 청소

끝마친 뒤 libxslt 와 libxml 에서는 메모리 해제를 위한 함수를 제공한다.

1: xsltFreeStylesheet(cur);
2: xmlFreeDoc(res);
3: xmlFreeDoc(doc);

4: xsltCleanupGlobals();
5: xmlCleanupParser();
  1. 스타일시트에 쓴 메모리 해제.
  2. 결과 문서에 쓴 메모리 해제.
  3. 원본 문서에 쓴 메모리 해제.
  4. libxslt 전역변수에 쓴 메모리 해제
  5. XML 구문분석기에 쓴 메모리 해제

3. 코드

libxslt_tutorial.c

/*
 * libxslt_tutorial.c: demo program for the XSL Transformation 1.0 engine
 *
 * based on xsltproc.c, by Daniel.Veillard@imag.fr
 * by John Fleck
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc.,  59 Temple Place - Suite 330, Cambridge, MA 02139, USA.
 *
 */ 

#include <string.h>
#include <libxml/xmlmemory.h>
#include <libxml/debugXML.h>

#include <libxml/HTMLtree.h>
#include <libxml/xmlIO.h>
#include <libxml/DOCBparser.h>
#include <libxml/xinclude.h>
#include <libxml/catalog.h>
#include <libxslt/xslt.h>

#include <libxslt/xsltInternals.h>
#include <libxslt/transform.h>
#include <libxslt/xsltutils.h>



extern int xmlLoadExtDtdDefaultValue;

static void usage(const char *name) {
    printf("Usage: %s [options] stylesheet file [file ...]\n", name);
    printf("      --param name value : pass a (parameter,value) pair\n");

}

int
main(int argc, char **argv) {
        int i;
        const char *params[16 + 1];
        int nbparams = 0;
        xsltStylesheetPtr cur = NULL;
        xmlDocPtr doc, res;

        if (argc <= 1) {
                usage(argv[0]);
                return(1);
        }
        

 for (i = 1; i < argc; i++) {
        if (argv[i][0] != '-')
            break;
        if ((!strcmp(argv[i], "-param")) ||
                   (!strcmp(argv[i], "--param"))) {
                i++;
                params[nbparams++] = argv[i++];
                params[nbparams++] = argv[i];
                if (nbparams >= 16) {
                        fprintf(stderr, "too many params\n");
                        return (1);
                }
        }  else {
            fprintf(stderr, "Unknown option %s\n", argv[i]);
            usage(argv[0]);
            return (1);
        }
    }

        params[nbparams] = NULL;
        xmlSubstituteEntitiesDefault(1);
        xmlLoadExtDtdDefaultValue = 1;
        cur = xsltParseStylesheetFile((const xmlChar *)argv[i]);
        i++;
        doc = xmlParseFile(argv[i]);
        res = xsltApplyStylesheet(cur, doc, params);
        xsltSaveResultToFile(stdout, res, cur);

        xsltFreeStylesheet(cur);
        xmlFreeDoc(res);
        xmlFreeDoc(doc);

        xsltCleanupGlobals();
        xmlCleanupParser();
        return(0);
}

4. 작업일지

  • 2005-03-08 윤현호: 위키문서로 변환 및 번역 안된 부분 번역
  • 2005-02-28 안기영: 최초 번역





sponsored by andamiro
sponsored by cdnetworks
sponsored by HP

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2005-03-08 09:31:35
Processing time 0.0330 sec