This may be what your looking for:
NOTE: this is just a fragment of a class I've developed, so if you try to
compile "as-is" you will get errors. The trick your looking for is
outlined in transformToDocument method.
Just in case your wondering about the "xmlapi" namespace - I developed an
API that wraps xercesc/msxml2/libxml API's into one easy to use interface.
Toggling between vendors is just a matter of flicking a processor switch.
Nice.
[source]
...
//--------------------------------------------------------------
xmlapi::DOMDocument::ptr transformToDocument () {
xercesc::DOMDocument * outDoc =
xercesc::DOMImplementation::getImplementation()->createDocument();
xalanc::FormatterToXercesDOM theFormatter(outDoc, 0);
transform_impl(theFormatter);
return new DOMDocumentImpl(outDoc);
}
//--------------------------------------------------------------
void transform (std::ostream & sstrm, bool
indent) {
transform_impl(sstrm);
}
private:
//--------------------------------------------------------------
template<class Output>
void transform_impl (Output & out) {
int err = 0;
xalanc::XercesParserLiaison parserLiaison;
#ifdef XERCESC_3
xalanc::XercesDOMSupport domSupport(parserLiaison);
#else
xalanc::XercesDOMSupport domSupport;
#endif
if (mInput.get() == NULL) {
throw xmlapi::XMLException(EXCEPTION_HERE, "input xml is NULL");
}
if (mStyleSheet == NULL) {
throw xmlapi::XMLException(EXCEPTION_HERE, "compiled styleheet is
NULL");
}
bool threadSafe = true;
bool buildWrapper = true;
xercesc::DOMDocument * xmlDoc =
dynamic_cast<DOMDocumentImpl*>(mInput.get())->mDoc;
xalanc::XalanDocument * xalanDocument =
parserLiaison.createDocument(xmlDoc, threadSafe, buildWrapper);
xalanc::XercesDOMWrapperParsedSource parsedSource (
parserLiaison.mapToXercesDocument(xalanDocument),
parserLiaison,
domSupport,
xalanc::XalanDOMString()
);
err = mTransformer.transform(parsedSource, mStyleSheet, out);
if (err) {
const char * errMsg = mTransformer.getLastError();
if (!errMsg) {
errMsg = "Unknown transform exception";
}
throw xmlapi::XMLException(EXCEPTION_HERE, errMsg);
}
}
...
[/source]
Kind regards,
Hans
>>However, you might want to look at the XSLT document function, instead
>>of generating a result DOM and modifying it. You can use the
>>xsl:copy-of instruction to copy an entire document
>
> While that sounds like an eminently good suggestion, I need to make this
> change without altering the XSLT workings of this program.
>
>> If you want a mutable result, then yes, you have to use the Xerces-C
> DOM.
>
> Ok, thanks so what I'm trying to is possible. You probably haven't
> wanted to tell me what is probably plainly obvious to anyone more
> familiar with these API's, but how do I alter an existing DOM document -
> I've seen and used the content handler to create a new document, but
> once its 'endDocument' method has been called - can the constructed
> document be further modified?
>
> -----Original Message-----
> From: David Bertoni [mailto:[email protected]]
> Sent: 13 August 2009 19:07
> To: [email protected]
> Subject: Re: Relative newbie question - How to augment XSLT generated
> output?
>
> [email protected] wrote:
>> I need to be able to augment an XSLT generated document by adding the
>> contents of another document to it as a child node. I tried
> generating
>> to an XalanSourceTreeDocument but when I invoked addChild an
>> XalanDOMException was raised with code 7 (modification not allowed).
> Do
>> I need to generate to an Xerces DOM instead, using
> FormatterToXercesDOM
>> as per one of the examples, and if so what are the steps to add one
>> document as the child of another XercesDOM - i.e. can I indeed add to
> a
>> fully formed document and do I need to clone the nodes from one
> document
>> before adding to another?
> If you want a mutable result, then yes, you have to use the Xerces-C
> DOM.
>
> However, you might want to look at the XSLT document function, instead
> of generating a result DOM and modifying it. You can use the
> xsl:copy-of instruction to copy an entire document anywhere you like in
> the result tree. It will also be much more efficient than generating a
> Xerces-C DOM document as the result, then appending another document.
>
> Dave
>
>
>
> This e-mail (including any attachments) is confidential, may contain
> proprietary or privileged information and is intended for the named
> recipient(s) only. Unintended recipients are prohibited from taking action
> on the basis of information in this e-mail and must delete all copies.
> Nomura will not accept responsibility or liability for the accuracy or
> completeness of, or the presence of any virus or disabling code in, this
> e-mail. If verification is sought please request a hard copy. Any
> reference
> to the terms of executed transactions should be treated as preliminary
> only
> and subject to formal written confirmation by Nomura. Nomura reserves the
> right to monitor e-mail communications through its networks (in accordance
> with applicable laws). No confidentiality or privilege is waived or lost
> by
> Nomura by any mistransmission of this e-mail. Any reference to "Nomura" is
> a reference to any entity in the Nomura Holdings, Inc. group. Please read
> our Electronic Communications Legal Notice which forms part of this
> e-mail:
> http://www.Nomura.com/email_disclaimer.htm
>
>
>