Nithya Nirmal Vijayakumar wrote:
Hi,
I am a new user to Xalan-C++. I want to apply xsl transformation to xml
stored in a buffer and get the output into a buffer. The
StreamTransform.cpp example reads from a buffer and writes output to a
stream. I want to make this write to a buffer. I saw some discussion about
this in this group and tried following the advice of extending
Callbackhandler. But I am getting many compilation errors. Has anyone
already done this? Could you please post your code? Any help will be
greatly appreciated.
The simplest thing is to use the class ostrstream. I've attached a diff
for the StreamTransform sample that does that.
This is what I tried:
//Declaration of wrapper class
XALAN_USING_XALAN(XalanOutputStream)
class xalan_string_stream:public XalanOutputStream{
private:
char *output;
char *buffer;
unsigned cursor;
public:
xalan_string_stream(MemoryManagerType
XALAN_DEFAULT_CONSTRUCTOR_MEMORY_MGR,
size_type theBufferSize = eDefaultBufferSize,
size_type theTranscoderBlockSize = eDefaultTranscoderBlockSize,
bool fThrowTranscodeException = true){
buffer=new char[1024];
}
~xalan_string_stream(){}
In the destructor, you need:
delete [] buffer;
or you'll have a memory leak;
void writeData (const char *input, size_type length){
bcopy(input,buffer,length);
}
This is extremely dangerous, because you have no guarantee the data will
fit in the buffer you've allocated.
void doFlush (){
}
char *get_result(){
return buffer;
}
};
//usage inside main
istrstream theXMLStream(theInputDocument,
strlen(theInputDocument));
istrstream theXSLStream(theStyleSheet, strlen(theStyleSheet));
XALAN_USING_XALAN(XalanDOMString)
XALAN_USING_XALAN(XalanOutputStreamPrintWriter)
XALAN_USING_XALAN(XSLTResultTarget)
XALAN_USING_XALAN(XSLTInputSource)
XSLTInputSource inputSource(&theXSLStream);
inputSource.setSystemId(XalanDOMString("foo").c_str());
const xalan_string_stream *outputStream = new xalan_string_stream();
XalanOutputStreamPrintWriter *printWriter=new
XalanOutputStreamPrintWriter((XalanOutputStream &)outputStream, false);
Where did you get this cast from? Are you trying to remove const from
the xalan_string_stream instance? Why would you define it const in the
first place?
This is much simpler:
xalan_string_stream outputStream;
XalanOutputStreamPrintWriter printWriter(&outputStream);
XSLTResultTarget target(&printWriter);
XSLTResultTarget target(printWriter);
theResult = theXalanTransformer.transform(&theXMLStream,
inputSource,target);
//compilation error obtained
BufferTransform.cpp:40: base `xalanc_1_10::XalanOutputStream' with only
non-default constructor in class without a constructor
Well, you have to call the base class constructor, and there's no
default for the base class. Perhaps you meant something like this:
XALAN_USING_XALAN(XalanOutputStream)
XALAN_USING_XALAN(XalanMemMgrs)
XALAN_USING_XALAN(MemoryManagerType)
class xalan_string_stream:public XalanOutputStream{
private:
char *output;
char *buffer;
unsigned cursor;
public:
xalan_string_stream(MemoryManagerType& theMgr
XALAN_DEFAULT_CONSTRUCTOR_MEMORY_MGR,
size_type theBufferSize = eDefaultBufferSize,
size_type theTranscoderBlockSize = eDefaultTranscoderBlockSize,
bool fThrowTranscodeException = true):
XalanOutputStream(
theMgr,
theBufferSize,
theTranscoderBlockSize,
fThrowTranscodeException) {
buffer=new char[1024];
}
...
BufferTransform.cpp:54: ISO C++ forbids defining types within return type
BufferTransform.cpp:54: destructors must be member functions
BufferTransform.cpp:54: return type specification for destructor invalid
BufferTransform.cpp:56: type specifier omitted for parameter `size_type'
BufferTransform.cpp:56: syntax error before `)' token
BufferTransform.cpp: In function `void writeData(...)':
BufferTransform.cpp:57: `input' undeclared (first use this function)
BufferTransform.cpp:57: (Each undeclared identifier is reported only once
for each function it appears in.)
BufferTransform.cpp:57: `buffer' undeclared (first use this function)
BufferTransform.cpp:57: `length' undeclared (first use this function)
BufferTransform.cpp: At global scope:
BufferTransform.cpp:66: syntax error before `}' token
BufferTransform.cpp: In function `int transform(const char*, char*)':
BufferTransform.cpp:155: ISO C++ forbids declaration of
`xalan_string_stream'
with no type
BufferTransform.cpp:155: uninitialized const `xalan_string_stream'
BufferTransform.cpp:155: syntax error before `*' token
BufferTransform.cpp:157: `outputStream' undeclared (first use this
function)
make: *** [all] Error 1
You should not be relying on this list to help you correct C++ syntax
errors. Please make sure your code is reasonably correct before you
post a question.
Dave
Index: StreamTransform.cpp
===================================================================
--- StreamTransform.cpp (revision 376143)
+++ StreamTransform.cpp (working copy)
@@ -49,6 +49,7 @@
XALAN_USING_STD(istrstream)
XALAN_USING_STD(ofstream)
XALAN_USING_STD(ostrstream)
+ XALAN_USING_STD(streamsize)
#if defined(XALAN_STRICT_ANSI_HEADERS)
using std::strlen;
@@ -122,8 +123,10 @@
inputSource.setSystemId(XalanDOMString("foo").c_str());
+ ostrstream theOutputStream;
+
// Do the transform.
- theResult =
theXalanTransformer.transform(&theXMLStream, inputSource, cout);
+ theResult =
theXalanTransformer.transform(&theXMLStream, inputSource, theOutputStream);
if(theResult != 0)
{
@@ -131,6 +134,16 @@
<< endl
<< endl;
}
+ else
+ {
+ const streamsize theCount =
theOutputStream.pcount();
+
+ char* const theData =
theOutputStream.str();
+
+ cout.write(theData, theCount);
+
+ theOutputStream.freeze(false);
+ }
}
// Terminate Xalan...