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>

Reply via email to