X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Fnormalize_record.c;h=129be2b4f0b466783480591bf347b5ddff1a1534;hb=1e9d110fab41514a2ed19a73d532197aaa29b526;hp=c7706e5640292e327c00832edbf514e31c1fed06;hpb=3e47667de1ebfaf4f42d2c0b71d4da2650ce7eb8;p=pazpar2-moved-to-github.git diff --git a/src/normalize_record.c b/src/normalize_record.c index c7706e5..129be2b 100644 --- a/src/normalize_record.c +++ b/src/normalize_record.c @@ -1,5 +1,5 @@ /* This file is part of Pazpar2. - Copyright (C) 2006-2009 Index Data + Copyright (C) 2006-2012 Index Data Pazpar2 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 @@ -29,56 +29,49 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "normalize_record.h" #include "pazpar2_config.h" - +#include "service_xslt.h" #include "marcmap.h" #include #include struct normalize_step { struct normalize_step *next; - xsltStylesheet *stylesheet; + xsltStylesheet *stylesheet; /* created by normalize_record */ + xsltStylesheet *stylesheet2; /* external stylesheet (service) */ struct marcmap *marcmap; }; struct normalize_record_s { struct normalize_step *steps; - char *spec; NMEM nmem; }; -const char *normalize_record_get_spec(normalize_record_t nt) -{ - if (nt) - return nt->spec; - return 0; -} - normalize_record_t normalize_record_create(struct conf_service *service, const char *spec) { - normalize_record_t nt = xmalloc(sizeof(*nt)); - struct normalize_step **m; + NMEM nmem = nmem_create(); + normalize_record_t nt = nmem_malloc(nmem, sizeof(*nt)); + struct normalize_step **m = &nt->steps; int i, num; int no_errors = 0; char **stylesheets; + struct conf_config *conf = service->server->config; - nt->nmem = nmem_create(); - - nt->spec = nmem_strdup(nt->nmem, spec); - - m = &nt->steps; + nt->nmem = nmem; nmem_strsplit(nt->nmem, ",", spec, &stylesheets, &num); for (i = 0; i < num; i++) { - WRBUF fname = conf_get_fname(service, stylesheets[i]); + WRBUF fname = conf_get_fname(conf, stylesheets[i]); *m = nmem_malloc(nt->nmem, sizeof(**m)); (*m)->marcmap = NULL; (*m)->stylesheet = NULL; - - // XSLT - if (!strcmp(&stylesheets[i][strlen(stylesheets[i])-4], ".xsl")) + + (*m)->stylesheet2 = service_xslt_get(service, stylesheets[i]); + if ((*m)->stylesheet2) + ; + else if (!strcmp(&stylesheets[i][strlen(stylesheets[i])-4], ".xsl")) { if (!((*m)->stylesheet = xsltParseStylesheetFile((xmlChar *) wrbuf_cstr(fname)))) @@ -88,7 +81,6 @@ normalize_record_t normalize_record_create(struct conf_service *service, no_errors++; } } - // marcmap else if (!strcmp(&stylesheets[i][strlen(stylesheets[i])-5], ".mmap")) { if (!((*m)->marcmap = marcmap_load(wrbuf_cstr(fname), nt->nmem))) @@ -128,39 +120,42 @@ void normalize_record_destroy(normalize_record_t nt) xsltFreeStylesheet(m->stylesheet); } nmem_destroy(nt->nmem); - - xfree(nt); } } int normalize_record_transform(normalize_record_t nt, xmlDoc **doc, - const char **parms) + const char **parms) { - struct normalize_step *m; - for (m = nt->steps; m; m = m->next) + if (nt) { - xmlNodePtr root = 0; - xmlDoc *new; - if (m->stylesheet) - { - new = xsltApplyStylesheet(m->stylesheet, *doc, parms); - } - else if (m->marcmap) - { - new = marcmap_apply(m->marcmap, *doc); - } - - root = xmlDocGetRootElement(new); - - if (!new || !root || !root->children) - { - if (new) - xmlFreeDoc(new); - xmlFreeDoc(*doc); - return -1; - } - xmlFreeDoc(*doc); - *doc = new; + struct normalize_step *m; + for (m = nt->steps; m; m = m->next) + { + xmlNodePtr root = 0; + xmlDoc *ndoc; + if (m->stylesheet) + ndoc = xsltApplyStylesheet(m->stylesheet, *doc, parms); + else if (m->stylesheet2) + ndoc = xsltApplyStylesheet(m->stylesheet2, *doc, parms); + else if (m->marcmap) + ndoc = marcmap_apply(m->marcmap, *doc); + else + ndoc = 0; + xmlFreeDoc(*doc); + *doc = 0; + + if (ndoc) + root = xmlDocGetRootElement(ndoc); + + if (ndoc && root && root->children) + *doc = ndoc; + else + { + if (ndoc) + xmlFreeDoc(ndoc); + return -1; + } + } } return 0; }