#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "debug.h" extern int xmlLoadExtDtdDefaultValue; void init_extensions(); /* TODO: check for parse errors */ static int error = 0; /* output usage message. progname is the name of the executable. */ static void usage(const char* progname) { printf("Usage: %s [options] stylesheet input output\n", progname); printf(" --param name value : pass a parameter to the stylesheet\n"); } int main(int argc, char** argv) { int argNum; const char **params = 0; int maxparams = 0; int nbparams = 0; xsltStylesheetPtr cur = NULL; xmlDocPtr doc, res; FILE *out; maxparams = 16; params = (const char**)malloc(sizeof(char*) * maxparams * 2); if (argc <= 1) { usage(argv[0]); return 1; } for (argNum = 1; argNum < argc; argNum++) { if (argv[argNum][0] != '-') break; if ((!strcmp(argv[argNum], "-param")) || (!strcmp(argv[argNum], "--param"))) { argNum++; params[nbparams++] = argv[argNum++]; params[nbparams++] = argv[argNum]; if (nbparams >= maxparams * 2) { maxparams *= 2; params = realloc(params, sizeof(char*) * maxparams * 2); } } else { fprintf(stderr, "Unknown option %s\n", argv[argNum]); usage(argv[0]); return 1; } } if ((argc - argNum) != 3) { usage(argv[0]); return 1; } params[nbparams] = NULL; xmlSubstituteEntitiesDefault(1); xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS; init_extensions(); cur = xsltParseStylesheetFile((const xmlChar *)argv[argNum]); argNum++; doc = xmlParseFile(argv[argNum]); argNum++; if(!doc) return 1; res = xsltApplyStylesheet(cur, doc, params); if(!res || error) return 1; out = fopen(argv[argNum], "w"); if(!out) return 1; xsltSaveResultToFile(out, res, cur); fclose(out); xsltFreeStylesheet(cur); xmlFreeDoc(res); xmlFreeDoc(doc); xsltCleanupGlobals(); xmlCleanupParser(); return 0; }