
#include <dom/deprecated/DOMParser.hpp>
#include <dom/deprecated/DOM_Document.hpp>
#include <XercesParserLiaison/XercesDOMSupport.hpp>
#include <XercesParserLiaison/XercesParserLiaison.hpp>
#include <XalanTransformer/XalanTransformer.hpp>
#include <iostream>

#define AL_NO_ERROR 0
#define AL_RC int

typedef const XALAN_CPP_NAMESPACE_QUALIFIER XalanCompiledStylesheet *stylesheet_t;

struct Reuse {
  Reuse()
    : theDOMSupport(), theParserLiaison(theDOMSupport),
      theXalanTransformer(), parser()
  {
    parser.setToCreateXMLDeclTypeNode(false);

    parser.setDoValidation(true);
    parser.setDoNamespaces(true);
  }

  XALAN_CPP_NAMESPACE_QUALIFIER XercesDOMSupport   	theDOMSupport;
  XALAN_CPP_NAMESPACE_QUALIFIER XercesParserLiaison	theParserLiaison;
  XALAN_CPP_NAMESPACE_QUALIFIER XalanTransformer	theXalanTransformer;
  XERCES_CPP_NAMESPACE_QUALIFIER DOMParser		parser;
};

stylesheet_t CompileStylesheet(Reuse& r, const XERCES_CPP_NAMESPACE_QUALIFIER DOM_Document& doc)
{
  stylesheet_t result = NULL;
  AL_RC al_rc = AL_NO_ERROR;
  XALAN_CPP_NAMESPACE_QUALIFIER XalanDocument* theDoc = r.theParserLiaison.createDocument(doc);
  XALAN_CPP_NAMESPACE_QUALIFIER XSLTInputSource theInput((XALAN_CPP_NAMESPACE_QUALIFIER XalanNode*)theDoc);

  theInput.setSystemId(doc.getBaseURI());

  if (r.theXalanTransformer.compileStylesheet(theInput, result) != 0) {
    std::cerr << r.theXalanTransformer.getLastError() << std::endl;
    result = NULL;
  }

  r.theParserLiaison.destroyDocument(theDoc);

  return result;
}

int run_test(void)
{
  int ret_val = 0;
  stylesheet_t result = NULL;

  Reuse reuse;

  reuse.parser.parse("tmp.xsl");
  XERCES_CPP_NAMESPACE_QUALIFIER DOM_Document doc = reuse.parser.getDocument();
  doc.normalize();
  result = CompileStylesheet(reuse, doc);
  if (result == NULL) {
    ret_val = -1;
  }

  return ret_val;
}

int main(int argc, char * argv[])
{
  int ret_val = 0;

  XERCES_CPP_NAMESPACE_QUALIFIER XMLPlatformUtils::Initialize();
  XALAN_CPP_NAMESPACE_QUALIFIER XalanTransformer::initialize();

  ret_val = run_test();

  XALAN_CPP_NAMESPACE_QUALIFIER XalanTransformer::terminate();
  XERCES_CPP_NAMESPACE_QUALIFIER XMLPlatformUtils::Terminate();

  return ret_val;
}

