-/* This file implements a XSLT engine working on Gdome documents. In fact,
- * it just maps Gdome documents to libxml documents back and forth, and
- * applyes the transformation on libxml documents using libxlt.
- *
- * The code is largely based on the code of T.J. Mather's XML::GDOME::XSLT
- * Perl module (http://kobesearch.cpan.org/search?dist=XML-GDOME-XSLT)
- *
- * Copyright (C) 2002:
- * Claudio Sacerdoti Coen <sacerdot@cs.unibo.it>
- * Stefano Zacchiroli <zack@cs.unibo.it>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * For more information, please send an email to {sacerdot,zack}@cs.unibo.it
- */
-
-#include <stdio.h>
-#include <libgdome/gdome.h>
-#include <libxslt/xsltconfig.h>
-#include <libxslt/xslt.h>
-#include <libxslt/xsltutils.h>
-#include <libxslt/transform.h>
-#include <libxslt/imports.h>
-#include "gdome_xslt.h"
-
-// Begin of Gdome internals exposed
-typedef struct _Gdome_xml_Document Gdome_xml_Document;
-struct _Gdome_xml_Document {
- GdomeDocument super;
- const GdomeDocumentVtab* vtab;
- int refcnt;
- xmlDocPtr n;
- GdomeAccessType accessType;
-};
-
-GdomeNode* gdome_xml_n_mkref(xmlNode* n);
-// End of Gdome internals exposed
-
-// Begin of the abstraction of Gdome internals. Uses the Gdome internals exposed
-xmlDocPtr libxml_of_gdome(GdomeDocument* doc)
-{
- return ((Gdome_xml_Document*)doc)->n;
-}
-
-GdomeDocument* gdome_of_libxml(xmlDocPtr n)
-{
- return (GdomeDocument*)gdome_xml_n_mkref((xmlNode*)n);
-}
-// End of the abstraction of Gdome internals. Uses the Gdome internals exposed.
-
-
-
-// From now on no Gdome internal should be used directly.
-
-xsltStylesheetPtr processStylesheet(GdomeDocument* style)
-{
- xmlDocPtr style_copy;
- xmlDocPtr style_libxml;
-
- if (style == NULL) {
- return NULL;
- }
- style_libxml = libxml_of_gdome(style);
- style_copy = xmlCopyDoc(style_libxml, 1);
- style_copy->URL = xmlStrdup(style_libxml->URL);
-
- xsltSetGenericDebugFunc(NULL, NULL);
-
- return xsltParseStylesheetDoc(style_copy);
-}
-
-GdomeDocument* applyStylesheet(GdomeDocument* source, xsltStylesheetPtr style_libxslt, const char** params)
-{
- xmlDocPtr source_libxml;
- xmlDocPtr output_libxml;
-
- if (source == NULL) return NULL;
- source_libxml = libxml_of_gdome(source);
-
- xsltSetGenericDebugFunc(NULL, NULL);
-
- output_libxml = xsltApplyStylesheet(style_libxslt,
- source_libxml,
- params);
-
- if (output_libxml == NULL) return NULL;
-
- return gdome_of_libxml(output_libxml);
-}
-
-/***************** serialization functions *****************/
-
-int saveResultToFilename (const char* name,
- GdomeDocument* result,
- xsltStylesheetPtr style_libxslt,
- int compression)
-{
- xmlDocPtr result_libxml;
-
- if (result == NULL) return -1;
- result_libxml = libxml_of_gdome(result);
-
- xsltSetGenericDebugFunc(NULL, NULL);
-
- return xsltSaveResultToFilename(name,
- result_libxml,
- style_libxslt,
- compression);
-}
-
-int saveResultToFile (FILE* file,
- GdomeDocument* result,
- xsltStylesheetPtr style_libxslt)
-{
- xmlDocPtr result_libxml;
-
- if (result == NULL) return -1;
- result_libxml = libxml_of_gdome(result);
-
- xsltSetGenericDebugFunc(NULL, NULL);
-
- return xsltSaveResultToFile(file,
- result_libxml,
- style_libxslt);
-}
-
-int saveResultToFd (int fd,
- GdomeDocument* result,
- xsltStylesheetPtr style_libxslt)
-{
- xmlDocPtr result_libxml;
-
- if (result == NULL) return -1;
- result_libxml = libxml_of_gdome(result);
-
- xsltSetGenericDebugFunc(NULL, NULL);
-
- return xsltSaveResultToFd(fd,
- result_libxml,
- style_libxslt);
-}
-