libXSLTプログラミング

 ここでは、libXSLTを使って、 xsltprocの簡易版のようなコマンドラインXSLTプロセッサを作ってみます。

#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;

  if(i == argc-1){
    /* XMLファイルしか指定されていない */
    doc = xmlParseFile(argv[i]);
    cur = xsltLoadStylesheetPI(doc);
    if(cur == NULL){
      fprintf(stderr, "Ootto! cannot get XSL-StyleSheet from XML.\n");
      return 1;
    }
  }
  else{
    /* XSTとXMLが両方指定されている */
    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);
}

 現時点では、libXSLTのドキュメント「libxslttutorial.html」 に記載されているサンプル・アプリケーションを120%活用したものなので、 細かい部分は分からないのですが、 とりあえずこれでまっとうに(!?)動きます。 ポイントは、XSLTプロセッサをかけるとき、XSLファイルをXML文書の冒頭部で 「xml-stylesheet」タグによって指定する場合と、 コマンドラインでXSLファイルとXML文書を両方していする場合がありますが、 これらはそれぞれ xsltLoadStylesheetPI、xsltParseStylesheetFileというAPIで簡単に行うことができます。

#
# Makefile
# 2002/08/11
#

CC	= gcc
CFLAGS	= -O2 -Wall -I/usr/include/libxml2
LDFLAGS	=
LIBS	= -lxml2 -lxslt -lexslt

.c.o:
	$(CC) $(CFLAGS) -c $?
minixslt: minixslt.o
	$(CC) -o $@ $(LDFLAGS) $(LIBS) minixslt.o

# end.

 UNIX用のMakefileは上のようになります。 libXML2など各種ライブラリを共有ではなく、スタティックリンクで作っている場合は、 -liconvも指定する必要があるかもしれません。

XML Top

(first uploaded 2002/08/14 last updated 2002/08/14, URANO398 - KQ TAURA)

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル