diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/function/write_file.cc | 53 | ||||
-rw-r--r-- | src/function/write_file.h | 4 | ||||
-rw-r--r-- | src/support/type/xobject_value.cc | 30 |
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); + } +} + } |