[prev in list] [next in list] [prev in thread] [next in thread] 

List:       xalan-c-users
Subject:    transforming with istream
From:       "SP/Nowotny Florian" <fn () vfst ! de>
Date:       2004-01-16 15:00:19
Message-ID: 773BA99608AAB14BA08611FB3A913B0D0DCA3E () dvex ! vfst ! int
[Download RAW message or body]

Hi everybody.
I'm using C++ with Xalan 1.4 (and Xerces 2.1).
Did anybody take a std::istream as XSLTInputSource for the \
XalanTransformer.transform(.,.,.) method?

Like the sample code below my program takes two files, converts the xml file into an \
std::ifstream and should transform it into a third file. 

Why do I get "Fatal Error at (file <unknown>, line 1, column 1): Invalid document \
structure"?

2nd attempt in code: It's the same problem when I use the buffer of the ifstream as \
the buffer of an std::istream. 3rd attempt: using a stringstream allows it to fill \
the buffer character by character.   Here I get the problem that Xalan seems to stop \
reading before the stream is ending. Why? 3rd extended: when I copy the str() into \
itself the transformation works. Is this how to do it?

By the way: It doesn't matter wether I take the xml oder the xsl file as istream (or \
both of them).

// 
// testing C++ xalan/xerces with istream
//

#include <Include/PlatformDefinitions.hpp>
#include <xercesc/util/PlatformUtils.hpp>
#include <XalanTransformer/XalanTransformer.hpp>

#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;

int main( int argc, const char* argv[] )
{
	try
	{
		if ( argc < 4 )
		{
			cerr << "------------------------------------------------------------" << endl
				<< "Usage: " << endl
				<< "tstxx xml xsl out" << endl
				<< endl
				<< " xml filename " << endl
				<< " xsl filename " << endl
				<< " out filename " << endl
				<< "------------------------------------------------------------" << endl;
			return 1;
		}
		else
		{
			// create Xalan instance
			XMLPlatformUtils::Initialize();
			XalanTransformer::initialize();
			XalanTransformer* pXalan = new XalanTransformer();
			if( pXalan == NULL )
			{
				cerr << "Error: no XalanTransformer ";
				return -1;
			}
			cout << "Xalan is ready." << endl;


		// 1st attempt
			// open XML file
			ifstream 	xml;
			xml.open( argv[1], ios::in );
			if( ! xml.is_open() )
			{
				cerr << argv[1] << " not opened!" << endl;
				return -1;
			}
			cout << "xml file open" << endl;

		// 2nd attempt
		/*
			// xml data into istream
			istream is( xml.rdbuf() );

			// show buffer content
			cout << is.rdbuf() << endl;
			// reset get pointer
			is.seekg( 0, ios::beg );

			cout << "istream get position is " << is.tellg() << endl;
			cout << "istream good? " << is.good() << endl;
		*/
		
		// 3rd attempt
		/*	
			stringstream ss;
			char c;
			while ( xml.get(c) )
				ss.put(c);
			
			cout << "stringstream get position is " << ss.tellg() << endl;
			cout << "stringstream good? " << ss.good() << endl;

			// uncomment this and no.3 works, why?
			//ss.str( ss.str() );
		*/
			// Choose the right one	
			XSLTInputSource in_xml( &xml );
			//XSLTInputSource in_xml( &is );
			//XSLTInputSource in_xml( &ss ); 


			// xsl input source, should be istream later
			XSLTInputSource in_xsl( argv[2] );

			// xml result, should be ostream later
			XSLTResultTarget out( argv[3] );

			int result =  pXalan->transform( in_xml, in_xsl, out );
			if(result != 0)
			{
				cerr << "Xalan Error: \n" << pXalan->getLastError() << endl;
				return -1;
			}

		}
	}
	catch( exception& e )
	{
		cerr << "exception: " << e.what() << endl;
	}
	catch( ... )
	{
		cerr << "unknown exception!" << endl;
	}

	return 0;
}


This is my XML file:
<?xml version="1.0" encoding="UTF-8"?>
<doc>
  <befehl> 
    something
  </befehl>
</doc>

This is my XSL file:
<?xml version="1.0"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" >
	
 <xsl:template match="/">       
   <xsl:apply-templates/>
 </xsl:template>
	
 <xsl:template match="befehl">
	 <tag>	 
   <xsl:value-of select="text()"/>
   </tag>	 
  </xsl:template>

</xsl:stylesheet>


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic