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:dbert...@apache.org] > Sent: 13 August 2009 19:07 > To: xalan-c-users@xml.apache.org > Subject: Re: Relative newbie question - How to augment XSLT generated > output? > > paul.band...@nomura.com 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 > > >