X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fnormalize_record.c;h=70082fd99aa9d2b3c666c6b4db33435ca71849cb;hb=64dccf5757a22cedd3c21ca834e3e02f39dd0504;hp=fa39da2aba316ebba218e5a1b0fb2b5667f8ea55;hpb=111cd7b055fafeb0bf763b3d44ddccdf9515a144;p=pazpar2-moved-to-github.git diff --git a/src/normalize_record.c b/src/normalize_record.c index fa39da2..70082fd 100644 --- a/src/normalize_record.c +++ b/src/normalize_record.c @@ -1,5 +1,5 @@ /* This file is part of Pazpar2. - Copyright (C) 2006-2010 Index Data + Copyright (C) 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,14 +29,15 @@ 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 *stylesheet1; /* created by normalize_record */ + xsltStylesheet *stylesheet2; /* external stylesheet (service) */ struct marcmap *marcmap; }; @@ -45,56 +46,85 @@ struct normalize_record_s { NMEM nmem; }; -normalize_record_t normalize_record_create(struct conf_config *conf, +normalize_record_t normalize_record_create(struct conf_service *service, const char *spec) { 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; + int embed = 0; + + if (*spec == '<') + embed = 1; nt->nmem = nmem; - nmem_strsplit(nt->nmem, ",", spec, &stylesheets, &num); - for (i = 0; i < num; i++) + if (embed) { - 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")) - { - if (!((*m)->stylesheet = - xsltParseStylesheetFile((xmlChar *) wrbuf_cstr(fname)))) - { - yaz_log(YLOG_FATAL|YLOG_ERRNO, "Unable to load stylesheet: %s", - stylesheets[i]); + xmlDoc *xsp_doc = xmlParseMemory(spec, strlen(spec)); + + if (!xsp_doc) + no_errors++; + else + { + *m = nmem_malloc(nt->nmem, sizeof(**m)); + (*m)->marcmap = NULL; + (*m)->stylesheet1 = NULL; + (*m)->stylesheet2 = NULL; + + + (*m)->stylesheet1 = xsltParseStylesheetDoc(xsp_doc); + if (!(*m)->stylesheet1) no_errors++; - } + m = &(*m)->next; } - // marcmap - else if (!strcmp(&stylesheets[i][strlen(stylesheets[i])-5], ".mmap")) + } + else + { + struct conf_config *conf = service->server->config; + int i, num; + char **stylesheets; + nmem_strsplit(nt->nmem, ",", spec, &stylesheets, &num); + + for (i = 0; i < num; i++) { - if (!((*m)->marcmap = marcmap_load(wrbuf_cstr(fname), nt->nmem))) + *m = nmem_malloc(nt->nmem, sizeof(**m)); + (*m)->marcmap = NULL; + (*m)->stylesheet1 = NULL; + (*m)->stylesheet2 = service_xslt_get(service, stylesheets[i]); + if ((*m)->stylesheet2) + ; + else if (!strcmp(&stylesheets[i][strlen(stylesheets[i])-4], ".xsl")) + { + WRBUF fname = conf_get_fname(conf, stylesheets[i]); + if (!((*m)->stylesheet1 = + xsltParseStylesheetFile((xmlChar *) wrbuf_cstr(fname)))) + { + yaz_log(YLOG_FATAL|YLOG_ERRNO, "Unable to load stylesheet: %s", + stylesheets[i]); + no_errors++; + } + wrbuf_destroy(fname); + } + else if (!strcmp(&stylesheets[i][strlen(stylesheets[i])-5], ".mmap")) + { + WRBUF fname = conf_get_fname(conf, stylesheets[i]); + if (!((*m)->marcmap = marcmap_load(wrbuf_cstr(fname), nt->nmem))) + { + yaz_log(YLOG_FATAL|YLOG_ERRNO, "Unable to load marcmap: %s", + stylesheets[i]); + no_errors++; + } + wrbuf_destroy(fname); + } + else { - yaz_log(YLOG_FATAL|YLOG_ERRNO, "Unable to load marcmap: %s", - stylesheets[i]); + yaz_log(YLOG_FATAL, "Cannot handle stylesheet: %s", stylesheets[i]); no_errors++; } + m = &(*m)->next; } - else - { - yaz_log(YLOG_FATAL, "Cannot handle stylesheet: %s", stylesheets[i]); - no_errors++; - } - - wrbuf_destroy(fname); - m = &(*m)->next; } *m = 0; /* terminate list of steps */ @@ -113,42 +143,51 @@ void normalize_record_destroy(normalize_record_t nt) struct normalize_step *m; for (m = nt->steps; m; m = m->next) { - if (m->stylesheet) - xsltFreeStylesheet(m->stylesheet); + if (m->stylesheet1) + xsltFreeStylesheet(m->stylesheet1); } nmem_destroy(nt->nmem); } } int normalize_record_transform(normalize_record_t nt, xmlDoc **doc, - const char **parms) + const char **parms) { - struct normalize_step *m; - if (nt) { + if (nt) + { + struct normalize_step *m; for (m = nt->steps; m; m = m->next) { xmlNodePtr root = 0; - xmlDoc *new; - if (m->stylesheet) - { - new = xsltApplyStylesheet(m->stylesheet, *doc, parms); - } + xmlDoc *ndoc; + if (m->stylesheet1) + ndoc = xsltApplyStylesheet(m->stylesheet1, *doc, parms); + else if (m->stylesheet2) + ndoc = xsltApplyStylesheet(m->stylesheet2, *doc, parms); else if (m->marcmap) - { - new = marcmap_apply(m->marcmap, *doc); - } - - root = xmlDocGetRootElement(new); - + ndoc = marcmap_apply(m->marcmap, *doc); + else + ndoc = 0; xmlFreeDoc(*doc); - if (!new || !root || !root->children) + *doc = 0; + + if (ndoc) + root = xmlDocGetRootElement(ndoc); + + if (ndoc && root && root->children) + *doc = ndoc; + else { - if (new) - xmlFreeDoc(new); - *doc = 0; + if (!ndoc) + yaz_log(YLOG_WARN, "XSLT produced no document"); + else if (!root) + yaz_log(YLOG_WARN, "XSLT produced XML with no root node"); + else if (!root->children) + yaz_log(YLOG_WARN, "XSLT produced XML with no root children nodes"); + if (ndoc) + xmlFreeDoc(ndoc); return -1; } - *doc = new; } } return 0;