aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdrian Kummerlaender2014-07-10 20:24:31 +0200
committerAdrian Kummerlaender2014-07-10 20:24:31 +0200
commit2192896e08572419edf99c81c3a524f07e877a10 (patch)
treeb51c538c84e713e58b42c099fc0c4e0a89d8893e /src
parent1fbf6a39784b57925ab19df579f487a338e22ba5 (diff)
downloadInputXSLT-2192896e08572419edf99c81c3a524f07e877a10.tar
InputXSLT-2192896e08572419edf99c81c3a524f07e877a10.tar.gz
InputXSLT-2192896e08572419edf99c81c3a524f07e877a10.tar.bz2
InputXSLT-2192896e08572419edf99c81c3a524f07e877a10.tar.lz
InputXSLT-2192896e08572419edf99c81c3a524f07e877a10.tar.xz
InputXSLT-2192896e08572419edf99c81c3a524f07e877a10.tar.zst
InputXSLT-2192896e08572419edf99c81c3a524f07e877a10.zip
Fixed TransformerFacade doctype output for xalan::FormatterToXML
* "xsl:output" was disregarded for xalan::FormatterToXML based output ** the setting contained within this tag have to be passed manually to the constructor... ** the xalan standard implementation includes special handling for this case ** sadly there was no alternative to adding special handling in InputXSLT as well, it is really quite ugly * added "dispatchTransformer" template member method to TransformerFacade ** calls xalan::FormatterToXML augmentation logic if needed, compiles template * this problem also exists for FunctionTransform output to xercesc DOM ** this patch doesn't aim to fix it in that case, it will have to be fixed separately
Diffstat (limited to 'src')
-rw-r--r--src/transformer_facade.cc87
-rw-r--r--src/transformer_facade.h8
2 files changed, 92 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
+ );
+}
+
}
diff --git a/src/transformer_facade.h b/src/transformer_facade.h
index 17db094..14d2f41 100644
--- a/src/transformer_facade.h
+++ b/src/transformer_facade.h
@@ -39,6 +39,14 @@ class TransformerFacade {
xalan::FormatterListener&
);
+ template <typename Source>
+ void dispatchTransformer(
+ const Source&,
+ const xalan::XSLTInputSource&,
+ xalan::FormatterListener&
+ );
+
+
};
}