aboutsummaryrefslogtreecommitdiff
path: root/src/transformer_facade.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/transformer_facade.cc')
-rw-r--r--src/transformer_facade.cc87
1 files changed, 84 insertions, 3 deletions
diff --git a/src/transformer_facade.cc b/src/transformer_facade.cc
index 76b68d6..5910bc7 100644
--- a/src/transformer_facade.cc
+++ b/src/transformer_facade.cc
@@ -3,6 +3,8 @@
#include <xalanc/PlatformSupport/XalanOutputStreamPrintWriter.hpp>
#include <xalanc/PlatformSupport/XalanStdOutputStream.hpp>
+#include <xalanc/XSLT/StylesheetRoot.hpp>
+#include <xalanc/XalanTransformer/XalanCompiledStylesheet.hpp>
#include <xalanc/XMLSupport/FormatterToXML.hpp>
#include <xalanc/XercesParserLiaison/FormatterToXercesDOM.hpp>
#include <xalanc/XMLSupport/FormatterTreeWalker.hpp>
@@ -14,6 +16,41 @@
#include "support/xerces_string_guard.h"
#include "support/dom/document_cache.h"
+namespace {
+
+std::unique_ptr<xalan::FormatterToXML> augmentFormatterToXML(
+ const xalan::XalanCompiledStylesheet* const transformation,
+ xalan::FormatterListener& formatter
+) {
+ const xalan::StylesheetRoot* const stylesheetRoot(
+ transformation->getStylesheetRoot()
+ );
+
+ xalan::XalanDOMString outputVersion;
+ xalan::XalanDOMString outputEncoding;
+ xalan::XalanDOMString outputMediaType;
+ xalan::XalanDOMString outputDoctypePublic;
+ xalan::XalanDOMString outputDoctypeSystem;
+ xalan::XalanDOMString outputStandalone;
+
+ return std::unique_ptr<xalan::FormatterToXML>(
+ new xalan::FormatterToXML(
+ *(formatter.getWriter()),
+ stylesheetRoot->getOutputVersion(outputVersion),
+ stylesheetRoot->getOutputIndent(),
+ 0,
+ stylesheetRoot->getOutputEncoding(outputEncoding),
+ stylesheetRoot->getOutputMediaType(outputMediaType),
+ stylesheetRoot->getOutputDoctypePublic(outputDoctypePublic),
+ stylesheetRoot->getOutputDoctypeSystem(outputDoctypeSystem),
+ !stylesheetRoot->getOmitOutputXMLDecl(),
+ stylesheetRoot->getOutputStandalone(outputStandalone)
+ )
+ );
+}
+
+}
+
namespace InputXSLT {
TransformerFacade::TransformerFacade(IncludeEntityResolver* resolver):
@@ -35,7 +72,7 @@ void TransformerFacade::generate(
if ( source.getNode() == nullptr ) {
ErrorCapacitor errorCapacitor(&this->error_multiplexer_);
- this->transformer_.transform(
+ this->dispatchTransformer(
source,
transformation,
target
@@ -70,7 +107,7 @@ void TransformerFacade::generate(
domSupport
);
- this->transformer_.transform(
+ this->dispatchTransformer(
inputParsedSource,
transformation,
target
@@ -107,7 +144,7 @@ void TransformerFacade::generate(
domSupport
);
- this->transformer_.transform(
+ this->dispatchTransformer(
inputParsedSource,
transformation,
target
@@ -116,4 +153,48 @@ void TransformerFacade::generate(
errorCapacitor.discharge();
}
+template <typename Source>
+void TransformerFacade::dispatchTransformer(
+ const Source& source,
+ const xalan::XSLTInputSource& transformation,
+ xalan::FormatterListener& target
+) {
+ const xalan::XalanCompiledStylesheet* compiledTransformation{};
+
+ this->transformer_.compileStylesheet(
+ transformation,
+ compiledTransformation
+ );
+
+ switch ( target.getOutputFormat() ) {
+ case xalan::FormatterListener::eFormat::OUTPUT_METHOD_XML: {
+ auto formatter = augmentFormatterToXML(
+ compiledTransformation,
+ target
+ );
+
+ this->transformer_.transform(
+ source,
+ compiledTransformation,
+ *formatter
+ );
+
+ break;
+ }
+ default: {
+ this->transformer_.transform(
+ source,
+ compiledTransformation,
+ target
+ );
+
+ break;
+ }
+ }
+
+ this->transformer_.destroyStylesheet(
+ compiledTransformation
+ );
+}
+
}