diff options
Diffstat (limited to 'src/function/generate.cc')
-rw-r--r-- | src/function/generate.cc | 73 |
1 files changed, 45 insertions, 28 deletions
diff --git a/src/function/generate.cc b/src/function/generate.cc index f9cd449..b93c2f1 100644 --- a/src/function/generate.cc +++ b/src/function/generate.cc @@ -2,6 +2,7 @@ #include <xalanc/PlatformSupport/XalanOutputStreamPrintWriter.hpp> #include <xalanc/PlatformSupport/XalanStdOutputStream.hpp> +#include <xalanc/XercesParserLiaison/FormatterToXercesDOM.hpp> #include <xalanc/XMLSupport/FormatterToXML.hpp> #include <boost/filesystem.hpp> @@ -16,53 +17,69 @@ namespace InputXSLT { DomDocumentCache::document_ptr FunctionGenerate::constructDocument( const FilesystemContext&, - xalan::XSLTInputSource inputSource, - xalan::XSLTInputSource transformationSource, - boost::filesystem::path targetPath + xalan::XSLTInputSource inputSource, + xalan::XSLTInputSource transformationSource, + boost::optional<boost::filesystem::path> targetPath ) const { DomDocumentCache::document_ptr domDocument( DomDocumentCache::createDocument("content") ); - ResultNodeFacade result(domDocument.get(), "generation"); - result.setAttribute("path", targetPath.string()); + ResultNodeFacade result(domDocument.get(), "generation"); + TransformerFacade transformer(this->include_resolver_); - boost::filesystem::create_directories(targetPath.parent_path()); - boost::filesystem::ofstream file(targetPath); + try { + if ( targetPath ) { + result.setAttribute("path", (*targetPath).string()); - if ( file.is_open() ) { - TransformerFacade transformer(this->include_resolver_); + boost::filesystem::create_directories( + (*targetPath).parent_path() + ); + + boost::filesystem::ofstream file(*targetPath); - try { - xalan::XalanStdOutputStream output(file); - xalan::XalanOutputStreamPrintWriter writer(output); - xalan::FormatterToXML targetFormatter(writer); + if ( file.is_open() ) { + xalan::XalanStdOutputStream output(file); + xalan::XalanOutputStreamPrintWriter writer(output); + xalan::FormatterToXML targetFormatter(writer); + + transformer.generate( + inputSource, + transformationSource, + targetFormatter + ); + } else { + result.setAttribute("result", "error"); + } + } else { + xalan::FormatterToXercesDOM targetFormatter( + domDocument.get(), + result.getResultElement() + ); transformer.generate( inputSource, transformationSource, targetFormatter ); - - result.setAttribute("result", "success"); } - catch (const ErrorCapacitor::exception& exception) { - result.setAttribute("result", "error"); - for ( auto&& error : *exception ) { - result.setValueNode("error", error); - } + result.setAttribute("result", "success"); + } + catch (const ErrorCapacitor::exception& exception) { + result.setAttribute("result", "error"); + + for ( auto&& error : *exception ) { + result.setValueNode("error", error); } + } - WarningCapacitor::warning_cache_ptr warnings( - transformer.getCachedWarnings() - ); + WarningCapacitor::warning_cache_ptr warnings( + transformer.getCachedWarnings() + ); - for ( auto&& warning : *warnings ) { - result.setValueNode("warning", warning); - } - } else { - result.setAttribute("result", "error"); + for ( auto&& warning : *warnings ) { + result.setValueNode("warning", warning); } return domDocument; |