diff options
author | Adrian Kummerlaender | 2014-07-05 21:55:48 +0200 |
---|---|---|
committer | Adrian Kummerlaender | 2014-07-05 21:55:48 +0200 |
commit | a02dce3c8e6086acbfe9c57c3ee4bb386bfbebc2 (patch) | |
tree | 669ad392772fcc9ab4eaa9e1a410156d6d4cc616 /src/function | |
parent | f05e742b88e3ebf7401c252332022f1a2f7eb8b0 (diff) | |
download | InputXSLT-a02dce3c8e6086acbfe9c57c3ee4bb386bfbebc2.tar InputXSLT-a02dce3c8e6086acbfe9c57c3ee4bb386bfbebc2.tar.gz InputXSLT-a02dce3c8e6086acbfe9c57c3ee4bb386bfbebc2.tar.bz2 InputXSLT-a02dce3c8e6086acbfe9c57c3ee4bb386bfbebc2.tar.lz InputXSLT-a02dce3c8e6086acbfe9c57c3ee4bb386bfbebc2.tar.xz InputXSLT-a02dce3c8e6086acbfe9c57c3ee4bb386bfbebc2.tar.zst InputXSLT-a02dce3c8e6086acbfe9c57c3ee4bb386bfbebc2.zip |
Revamped implementation to support FunctionTransform XalanNode input
* FunctionTransform now accepts xalan::XalanNode base xalan::XSLTInputSource instances as input parameter
** such xalan::XSLTInputSource instances were already supported for the stylesheet parameter but not for the input parameter
** e.g. it is now possible to generate a DOM inside a transformation, pass the DOM into a embedded transformation as input, modifiy the output of that transformation, pass this modified DOM into another transformation and so on... you get the point
* this required a revamp of TransformationFacade
** it is now a transformation independent wrapper for xalan::XalanTransformer
*** as such is was renamed to TransformerFacade
** removed error catching template factory method "try_create" as it is not needed anymore
** "std::basic_ostream<char>&" taking "generate" member method overloads were removed
** the set of "generate" member overloads was reduced to two methods accepting xalan::XSLTInputSource and xalan::FormatterListener as parameters
* the core problem first documented in 299d0f6 was solved by transforming the input parameter into a xerces DOM and wrapping this DOM inside a xalan::XercesDOMWrapperParsedSource instance
* serialization of the transformation result for file / std::cout output is now performed directly by the ixslt frontend
* removed 'stylesheet parameter' parameter from FunctionTransform
** the functionality provided by this is easily replicated using the now possible DOM input parameter
** this was done to simplify the interface and reduce unnecessary feature duplication
* updated FunctionTransform test case accordingly
* added "generate" template function to ixslt frontend
** wraps TransformerFacade and manages ist input arguments
** handles serialization to stream
* this commit marks a important milestone towards the goals defined in 741a70f
Diffstat (limited to 'src/function')
-rw-r--r-- | src/function/transform.cc | 72 | ||||
-rw-r--r-- | src/function/transform.h | 6 |
2 files changed, 35 insertions, 43 deletions
diff --git a/src/function/transform.cc b/src/function/transform.cc index 1d22399..e53b55f 100644 --- a/src/function/transform.cc +++ b/src/function/transform.cc @@ -6,7 +6,7 @@ #include <xercesc/dom/DOMImplementation.hpp> #include <xercesc/dom/DOMElement.hpp> -#include "transformation_facade.h" +#include "transformer_facade.h" #include "support/xerces_string_guard.h" #include "support/dom/result_node_facade.h" #include "support/error/error_capacitor.h" @@ -15,15 +15,15 @@ namespace { using InputXSLT::ErrorCapacitor; -inline std::function<void(const ErrorCapacitor::error_cache&)> handleErrors( - InputXSLT::ResultNodeFacade& result) { - return [&result](const ErrorCapacitor::error_cache& errors) { - result.setAttribute("result", "error"); +inline void handleErrors( + InputXSLT::ResultNodeFacade& result, + const ErrorCapacitor::error_cache& errors +) { + result.setAttribute("result", "error"); - for ( auto&& error : errors ) { - result.setValueNode("error", error); - } - }; + for ( auto&& error : errors ) { + result.setValueNode("error", error); + } } } @@ -32,8 +32,7 @@ namespace InputXSLT { xercesc::DOMDocument* FunctionTransform::constructDocument( xalan::XSLTInputSource inputSource, - xalan::XSLTInputSource transformationSource, - xalan::XObjectPtr parameterObject + xalan::XSLTInputSource transformationSource ) { xercesc::DOMDocument* const domDocument( xercesc::DOMImplementation::getImplementation()->createDocument( @@ -48,37 +47,32 @@ xercesc::DOMDocument* FunctionTransform::constructDocument( ); ResultNodeFacade result(domDocument, rootElement, "transformation"); + TransformerFacade transformer(this->include_resolver_); - if ( auto transformation = TransformationFacade::try_create( - handleErrors(result), - inputSource, - transformationSource, - this->include_resolver_ - ) ) { - try { - xalan::FormatterToXercesDOM formatter( - domDocument, - result.getResultElement() - ); - - transformation->generate( - formatter, - parameterObject - ); - - result.setAttribute("result", "success"); - } - catch (const ErrorCapacitor::exception& exception) { - handleErrors(result)(*exception); - } - - WarningCapacitor::warning_cache_ptr warnings( - transformation->getCachedWarnings() + try { + xalan::FormatterToXercesDOM targetFormatter( + domDocument, + result.getResultElement() ); - for ( auto&& warning : *warnings ) { - result.setValueNode("warning", warning); - } + transformer.generate( + inputSource, + transformationSource, + targetFormatter + ); + + result.setAttribute("result", "success"); + } + catch (const ErrorCapacitor::exception& exception) { + handleErrors(result, *exception); + } + + WarningCapacitor::warning_cache_ptr warnings( + transformer.getCachedWarnings() + ); + + for ( auto&& warning : *warnings ) { + result.setValueNode("warning", warning); } return domDocument; diff --git a/src/function/transform.h b/src/function/transform.h index 234a1d0..b8e733d 100644 --- a/src/function/transform.h +++ b/src/function/transform.h @@ -10,8 +10,7 @@ namespace InputXSLT { class FunctionTransform : public FunctionBase< FunctionTransform, xalan::XSLTInputSource, - xalan::XSLTInputSource, - xalan::XObjectPtr + xalan::XSLTInputSource > { public: using FunctionBase::FunctionBase; @@ -21,8 +20,7 @@ class FunctionTransform : public FunctionBase< xercesc::DOMDocument* constructDocument( xalan::XSLTInputSource, - xalan::XSLTInputSource, - xalan::XObjectPtr + xalan::XSLTInputSource ); }; |