This transformation example uses a simple object named book. This object simply holds an author name and a book title. For the complete example, see buildspace\examples\xmlstreams\xsltTransform\xsltTransform.cpp.
This example is based on the examples used in Chapter 5.
class book { public: book (); book (const RWCString& title, const RWCString& author); private: RWCString title_; RWCString author_; }; |
This section discusses the main() function for the example. The explanation is broken into three parts:
creating a book object and serializing it to a file using an XML stream that applies a transformation to make the resulting XML more readable
reading the file back in and restoring the book object using an XML stream that applies a transformation to restore the original XML format
printing out both the original XML streams data for the book object and its more readable, transformed version
First, create a book object and serialize it out to a file. Because the XML format generated by XML streams is difficult to read, you transform the output stream into a more easily-readable format.
int main() { using std::ofstream; //1 using std::ifstream; using std::cout; using std::endl; book book1("To Love and Be Wise","Josephine Tey"); //2 book book2; XMLPlatformUtils::Initialize(); //3 XalanTransformer::initialize(); //4 { ofstream fout("book.xml"); //5 ifstream script("../XmlStreamOut.xsl"); //6 RWObjectOutputStream out = //7 RWXsltObjectOutputStreamImp::make(fout,script); out << book1; //8 out.flush(); //9 } |
At this point you have written the book object XML data to the file book.xml. Next you are ready to restore the object, which involves:
reading in the file book.xml
transforming the XML back to the form required by XML streams
restoring the object as book2
{ ifstream fin("book.xml"); //1 ifstream script("../XmlStreamIn.xsl"); //2 RWObjectInputStream in = //3 RWXsltObjectInputStreamImp::make(fin,script); in >> book2; //4 } |
//1 | Creates an ifstream for reading in the object data. |
//2 | Creates an ifstream for reading in the input XSLT stylesheet. |
//3 | Sets up an XML input stream that includes support for a transformation by passing the ifstream to the input XSLT stylesheet. |
//4 | Restores the book object as the book2 instance create earlier, transforming the XML back to the expected XML format in the process. |
Finally, the example writes to standard out two forms of the serialized object:
the transformed, more readable version
the form created by the XML serialization and expected by XML streams when the object is restored
{ ifstream script("../XmlStreamOut.xsl"); //1 RWObjectOutputStream out = //2 RWXsltObjectOutputStreamImp::make(cout,script); out << book2; //3 } cout << endl; { RWObjectOutputStream out = //4 RWXmlObjectOutputStreamImp::make(cout); out << book2; //5 } return 0; } |
//1 | Creates an ifstream for reading in the output XSLT stylesheet. |
//2 | Sets up an XML output stream that includes support for a transformation by passing the ifstream to the output XSLT stylesheet. |
//3 | Streams the transformed version of the book2 object to standard out. |
//4 | Sets up an XML output stream with no transformation support. |
//5 | Streams the standard XML streams version of the book2 object to standard out. |
Here is the resulting output:
With transformation:
<?xml version="1.0" encoding="UTF-8"?> <book xmlns:rw="http://www.roguewave.com/xmlstream" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xsi:type="book"> <title xsi:type="xsd:string">To Love and Be Wise</title> <author xsi:type="xsd:string">Josephine Tey</author> </book> |
Without transformation:
<?xml version="1.0" standalone="yes"?> <rw:nested_object rw:class="book" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:rw="http://www.roguewave.com/xmlstream"> <rw:member rw:name="title" xsi:type="xsd:string">To Love and Be Wise</rw:member> <rw:member rw:name="author" xsi:type="xsd:string">Josephine Tey</rw:member> </rw:nested_object> |
Copyright © Rogue Wave Software, Inc. All Rights Reserved.
The Rogue Wave name and logo, and SourcePro, are registered trademarks of Rogue Wave Software. All other trademarks are the property of their respective owners.
Provide feedback to Rogue Wave about its documentation.