X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=parse-xml.c;h=bc4d4c54661aeb1db4d2462e49625ce8b5997174;hb=4891fa812f04da1f46075433d28fa0f33145e125;hp=5eabc353c17c47e4e68db5e0db2ded912f2b1437;hpb=485b02937d8ca1f9a9043c89e74a3d2f15d6426b;p=ext%2Fsubsurface.git diff --git a/parse-xml.c b/parse-xml.c index 5eabc35..bc4d4c5 100644 --- a/parse-xml.c +++ b/parse-xml.c @@ -3,10 +3,14 @@ #include #include #include +#include #define __USE_XOPEN #include #include #include +#ifdef XSLT +#include +#endif #include "dive.h" #include "uemis.h" @@ -1466,6 +1470,9 @@ void parse_xml_file(const char *filename, GError **error) set_filename(filename); reset_all(); dive_start(); +#ifdef XSLT + doc = test_xslt_transforms(doc); +#endif traverse(xmlDocGetRootElement(doc)); dive_end(); xmlFreeDoc(doc); @@ -1476,3 +1483,70 @@ void parse_xml_init(void) { LIBXML_TEST_VERSION } + +#ifdef XSLT + +/* Maybe we'll want a environment variable that can override this.. */ +static const char *xslt_path = XSLT ":xslt:."; + +static xsltStylesheetPtr try_get_stylesheet(const char *path, int len, const char *name) +{ + xsltStylesheetPtr ret; + int namelen = strlen(name); + char *filename = malloc(len+1+namelen+1); + + if (!filename) + return NULL; + + memcpy(filename, path, len); + filename[len] = G_DIR_SEPARATOR; + memcpy(filename + len + 1, name, namelen+1); + + ret = NULL; + if (!access(filename, R_OK)) + ret = xsltParseStylesheetFile(filename); + free(filename); + + return ret; +} + +static xsltStylesheetPtr get_stylesheet(const char *name) +{ + const char *path = xslt_path, *next; + + do { + int len; + xsltStylesheetPtr ret; + + next = strchr(path, ':'); + len = strlen(path); + if (next) { + len = next - path; + next++; + } + ret = try_get_stylesheet(path, len, name); + if (ret) + return ret; + } while ((path = next) != NULL); + + return NULL; +} + +xmlDoc *test_xslt_transforms(xmlDoc *doc) +{ + xmlDoc *transformed; + xsltStylesheetPtr xslt = NULL; + xmlNode *root_element = xmlDocGetRootElement(doc); + if (strcasecmp(root_element->name, "JDiveLog") == 0) { + xmlSubstituteEntitiesDefault(1); + xslt = get_stylesheet("jdivelog2subsurface.xslt"); + if (xslt == NULL) + return doc; + transformed = xsltApplyStylesheet(xslt, doc, NULL); + xmlFreeDoc(doc); + xsltFreeStylesheet(xslt); + return transformed; + } + return doc; +} +#endif