diff options
author | Adrian Kummerlaender | 2014-06-29 20:36:28 +0200 |
---|---|---|
committer | Adrian Kummerlaender | 2014-06-29 20:36:28 +0200 |
commit | bd39d49464dbd17eb3d4cdbb5784431e43e56fbf (patch) | |
tree | 48013d44196637c6ac434c239be1b4950ba7056f | |
parent | 299d0f6fa3fbd1bfd8d1d6d452e9d055973d0e0e (diff) | |
download | InputXSLT-bd39d49464dbd17eb3d4cdbb5784431e43e56fbf.tar InputXSLT-bd39d49464dbd17eb3d4cdbb5784431e43e56fbf.tar.gz InputXSLT-bd39d49464dbd17eb3d4cdbb5784431e43e56fbf.tar.bz2 InputXSLT-bd39d49464dbd17eb3d4cdbb5784431e43e56fbf.tar.lz InputXSLT-bd39d49464dbd17eb3d4cdbb5784431e43e56fbf.tar.xz InputXSLT-bd39d49464dbd17eb3d4cdbb5784431e43e56fbf.tar.zst InputXSLT-bd39d49464dbd17eb3d4cdbb5784431e43e56fbf.zip |
Switched FunctionWriteFile content parameter to xalan::XalanNode pointer
* i.e. "write-file" now supports the serialization of given DOM structures
** this will be needed e.g. if FunctionTransform returns the result as a DOM tree instead of as a plain string
** enables the creation of multiple XML documents from within a single transformation
*** i.e. backports the functionality provided in XSLT 2.0 by "xsl:result-document" to xalan's XSLT 1.0
* changed test cases accordingly
-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 | ||||
-rw-r--r-- | test/write_file/reference.xml | 3 | ||||
-rw-r--r-- | test/write_file/transformation.xsl | 13 |
5 files changed, 76 insertions, 27 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); + } +} + } diff --git a/test/write_file/reference.xml b/test/write_file/reference.xml index ba10cf5..e16d0b5 100644 --- a/test/write_file/reference.xml +++ b/test/write_file/reference.xml @@ -1,3 +1,2 @@ <?xml version="1.0" encoding="UTF-8"?> -<test_case>Hello world! -</test_case> +<test_case>Hello world!</test_case> diff --git a/test/write_file/transformation.xsl b/test/write_file/transformation.xsl index f65e62d..82afdfc 100644 --- a/test/write_file/transformation.xsl +++ b/test/write_file/transformation.xsl @@ -10,12 +10,17 @@ <xsl:import href="[testcase.xsl]"/> <xsl:template name="implementation"> - <xsl:variable name="result" select="InputXSLT:write-file('test.txt', 'Hello world!')"/> - <xsl:variable name="content" select="InputXSLT:read-file('test.txt')"/> + <xsl:variable name="testContent"> + <content> + <entry>Hello world!</entry> + </content> + </xsl:variable> + <xsl:variable name="result" select="InputXSLT:write-file('test.xml', $testContent)"/> + <xsl:variable name="actualContent" select="InputXSLT:read-file('test.xml')"/> <xsl:choose> - <xsl:when test="$content/self::file/@result = 'success'"> - <xsl:value-of select="$content/self::file/text()"/> + <xsl:when test="$actualContent/self::file/@result = 'success'"> + <xsl:value-of select="$actualContent/self::file/content/entry"/> </xsl:when> <xsl:otherwise> Error during file io |