aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/function/write_file.cc53
-rw-r--r--src/function/write_file.h4
-rw-r--r--src/support/type/xobject_value.cc30
3 files changed, 66 insertions, 21 deletions
diff --git a/src/function/write_file.cc b/src/function/write_file.cc
index 39495d8..024a87a 100644
--- a/src/function/write_file.cc
+++ b/src/function/write_file.cc
@@ -1,5 +1,10 @@
#include "write_file.h"
+#include <xalanc/PlatformSupport/XalanOutputStreamPrintWriter.hpp>
+#include <xalanc/PlatformSupport/XalanStdOutputStream.hpp>
+#include <xalanc/XMLSupport/FormatterToXML.hpp>
+#include <xalanc/XMLSupport/FormatterTreeWalker.hpp>
+
#include <xercesc/dom/DOMDocument.hpp>
#include <xercesc/dom/DOMImplementation.hpp>
#include <xercesc/dom/DOMElement.hpp>
@@ -7,21 +12,47 @@
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
+#include "support/xalan_string.h"
#include "support/xerces_string_guard.h"
#include "support/dom/result_node_facade.h"
namespace {
-bool writeFile(
+bool serializeNodeToFile(
const boost::filesystem::path& filePath,
- const std::string& content
+ xalan::XalanNode* const contentNode
) {
- boost::filesystem::ofstream file(filePath);
+ const xalan::XalanNode::NodeType contentType(
+ contentNode->getNodeType()
+ );
+
+ if ( contentType != xalan::XalanNode::DOCUMENT_NODE &&
+ contentType != xalan::XalanNode::ATTRIBUTE_NODE ) {
+ boost::filesystem::ofstream file(filePath);
+
+ if ( file.is_open() ) {
+ if ( contentType == xalan::XalanNode::TEXT_NODE ) {
+ file << InputXSLT::toString(contentNode->getNodeValue());
+ } else {
+ xalan::XalanStdOutputStream outputStream(file);
+ xalan::XalanOutputStreamPrintWriter outputWriter(outputStream);
+
+ xalan::FormatterToXML formatter(outputWriter);
+ xalan::FormatterTreeWalker walker(formatter);
+
+ formatter.startDocument();
+
+ walker.traverseSubtree(contentNode);
+
+ formatter.endDocument();
+ }
- if ( file.is_open() ) {
- file << content << std::endl;
+ file << std::endl;
- return true;
+ return true;
+ } else {
+ return false;
+ }
} else {
return false;
}
@@ -33,7 +64,7 @@ namespace InputXSLT {
xercesc::DOMDocument* FunctionWriteFile::constructDocument(
boost::filesystem::path filePath,
- std::string content
+ xalan::XalanNode* const contentNode
) {
xercesc::DOMDocument* const domDocument(
xercesc::DOMImplementation::getImplementation()->createDocument(
@@ -50,8 +81,12 @@ xercesc::DOMDocument* FunctionWriteFile::constructDocument(
ResultNodeFacade result(domDocument, rootNode, "file");
result.setAttribute("path", filePath.string());
- if ( writeFile(filePath, content) ) {
- result.setAttribute("result", "success");
+ if ( contentNode != nullptr ) {
+ if ( serializeNodeToFile(filePath, contentNode) ) {
+ result.setAttribute("result", "success");
+ } else {
+ result.setAttribute("result", "error");
+ }
} else {
result.setAttribute("result", "error");
}
diff --git a/src/function/write_file.h b/src/function/write_file.h
index 2260055..5fd9f3e 100644
--- a/src/function/write_file.h
+++ b/src/function/write_file.h
@@ -8,7 +8,7 @@ namespace InputXSLT {
class FunctionWriteFile : public FunctionBase<
FunctionWriteFile,
boost::filesystem::path,
- std::string
+ xalan::XalanNode*
> {
public:
using FunctionBase::FunctionBase;
@@ -18,7 +18,7 @@ class FunctionWriteFile : public FunctionBase<
xercesc::DOMDocument* constructDocument(
boost::filesystem::path,
- std::string
+ xalan::XalanNode* const
);
};
diff --git a/src/support/type/xobject_value.cc b/src/support/type/xobject_value.cc
index 46ce53c..a788e8e 100644
--- a/src/support/type/xobject_value.cc
+++ b/src/support/type/xobject_value.cc
@@ -46,25 +46,35 @@ xalan::XObjectPtr XObjectValue::get<xalan::XObjectPtr>(
}
template <>
-xalan::XSLTInputSource XObjectValue::get<xalan::XSLTInputSource>(
+xalan::XalanNode* XObjectValue::get<xalan::XalanNode*>(
const xalan::XObjectPtr& ptr) const {
switch ( ptr->getType() ) {
case xalan::XObject::eObjectType::eTypeNodeSet: {
- return xalan::XSLTInputSource(
- ptr->nodeset().item(0)
- );
+ return ptr->nodeset().item(0);
}
case xalan::XObject::eObjectType::eTypeResultTreeFrag: {
- return xalan::XSLTInputSource(
- ptr->rtree().getFirstChild()
- );
+ return ptr->rtree().getFirstChild();
}
default: {
- return xalan::XSLTInputSource(
- this->get<boost::filesystem::path>(ptr).string().data()
- );
+ return nullptr;
}
}
}
+template <>
+xalan::XSLTInputSource XObjectValue::get<xalan::XSLTInputSource>(
+ const xalan::XObjectPtr& ptr) const {
+ xalan::XalanNode* const node(
+ this->get<xalan::XalanNode*>(ptr)
+ );
+
+ if ( node == nullptr ) {
+ return xalan::XSLTInputSource(
+ this->get<boost::filesystem::path>(ptr).string().data()
+ );
+ } else {
+ return xalan::XSLTInputSource(node);
+ }
+}
+
}