My code doesn't really do anything special. If you want to use it from a stock version (1.4/1.5), you can unintegrate quite easily -- just remove the sections that allow you to get a cached nodeset or rtf builder from the patch (anything that integrates into XPathExecutionContext, XPathExecutionContextDefault or StyleSheetExecutionContextDefault). (These just make the thing easier to use). You then create a new builder object of the appropriate type, passing the execution context to it (which is provided to the extension function), and use it as normal, deleting when done. I can give more detail if required, but I'm pretty sure that this is easier than reinventing the wheel...
> -----Original Message----- > From: Abram-Profeta, Emmanuel [mailto:[EMAIL PROTECTED] > Sent: 25 April 2003 19:21 > To: [EMAIL PROTECTED]; [email protected] > Subject: RE: Best way to create a XalanNode inside an extension function > > > Thanks Dave for your answer. It helps a lot to know that I wasn't > too much off-track :-) > > I'll try to come up with a work-around while working with 1.4 and > 1.5. If I manage to pull it off, I may send some user-code > snippets for feedback. > > Emmanuel > > -----Original Message----- > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] > Sent: Friday, April 25, 2003 8:38 AM > To: [email protected] > Subject: RE: Best way to create a XalanNode inside an extension function > > > > > > Hi Emmanuel, > > Mark Weaver has submitted code to introduce this functionality, but it did > not make it into 1.5. Once 1.5 is out, I will review the code and > integrate it into the CVS repository, so it will be available soon. > > It's rather tricky, because you need a mechanism to track the owner > document of the nodes you create from scratch. Also, you have to > build the > document through the use of SAX events, because the tree must be built in > document order. > > Dave > > > > > > "Abram-Profeta, > > Emmanuel" To: > "Abram-Profeta, Emmanuel" <[EMAIL PROTECTED]>, > <[EMAIL PROTECTED] > <[email protected]> > > .com> cc: (bcc: > David N Bertoni/Cambridge/IBM) > Subject: RE: Best > way to create a XalanNode inside an extension function > 04/24/2003 12:35 > > PM > > > > > > > Sorry for repeating this question. I thought I'd try to clarify my problem > and see if someone has run into similar issue. I've had this > question for a > while so I am eager to find out what others have to say. > > Basically, I'd like to create a node set inside an extension function. In > pseudo-code, here's what's going on: > > In the stylesheet, I have something like > <xsl:copy-of select="external:myfunc($input)"/> > > where $input is a node set defined as: > <xsl:variable name="input" select="/Elements/Element"/> > > and documents are like > <?xml version="1.0" encoding="UTF-8"?> > <Elements> > <Element>1</Element> > <Element>2</Element> > </Elements> > > In the extension function, the code (vastly simplified) is like > > XObjectPtr FunctionPromoCache::execute( > XPathExecutionContext& executionContext, XalanNode* context, const > XObjectArgVectorType& args, const LocatorType* locator) const > { > ... > > const ResultTreeFragBase& theInput = args[0]->rtree(); > > std::vector<XalanNode*> theElements > > // > // fill the vector with individual XalanNodes > // > > XalanNode* pChild = pNode->getFirstChild(); > > if (!pChild) > { > ... > } > do { > if (pChild->getNodeType() != XalanNode::ELEMENT_NODE) > { > continue; > } > theElements.push_back(pChild); > > } while (pChild = pChild->getNextSibling()); > > // > // Create the result - for the sake of this example, without > any change > // > > XObjectFactory::BorrowReturnMutableNodeRefList > theResult(executionContext); > > std::vector<XalanNode*>::const_iterator itNode = > theElements.begin(),endNode = theElements.end(); > > for (;itNode != endNode; ++itNode) > { > theResult->addNode(*itNode); > } > > return executionContext.getXObjectFactory().createNodeSet(theResult); > } > > So, this function works as long as the result contains pointers > to existing > nodes created during the transform. Here, the XSL statement copy-of will > output > <Element>1</Element> > <Element>2</Element> > > My problem is that I would like to create new nodes and embedded the > existing elements in them. For instance, I'd like the <xsl:copy-of > select="external:myfunc($input)"/> to return something like > > <MyElements> > <Element>1</Element> > ... > <WeirdElements> > <Element>3</Element> > ... > </WeirdElements> > </MyElements> > > where I'd create the MyElements and WeirdElements nodes inside the > extension function. > > So my question is, what is the best way to generate new XalanNodes in such > a way that they get properly created and deleted inside the > transformation. > > Thanks in advance, > > Emmanuel > > -----Original Message----- > From: Abram-Profeta, Emmanuel > Sent: Wednesday, April 23, 2003 12:39 PM > To: [email protected] > Subject: Best way to create a XalanNode inside an extension function > > Hi, > > I looked at the extensionFunction sample in Xalan 1.4 and 1.5 and I > am trying to come up with a function that builds new elements > dynamically. > > Background: The examples shown deal with string/number like results > (e.g., sqrt, cube, etc). For instance (sorry for the tabs...) > > virtual XObjectPtr > execute( > XPathExecutionContext& > executionContext, > XalanNode* > context, > const XObjectArgVectorType& > args, > const LocatorType* > locator) const > { > > .... > > return > > executionContext.getXObjectFactory().createNumber(sqrt(args[0]->num())); > } > > So far, I've been able to do the same thing and use the > executionContext.getXObjectFactory().createNodeSet() function to > return XalanNode* pointers belonging to XalanDocument objects output > by a transform or created from a xerces DOM using the > XercesDOMParserLiaison. > > However, what I'd like to do is manually create a XalanNode* that > would be an XML element with embedded elements within; The > difference > here is that I am not reusing pointers to locations of existing > documents. I'm aware that it may sound like a trivial question but > after experimenting with the XalanDOM and the XalanSourceTree > classes, I noticed that there's still a lot of functionality that > remains to be implemented. (Hence my questions.) > > One trivial way I thought of was to just create a string containing > the XML I need and parse it inside the extension function. But I'm > sure there's a smarter and better way to just say "create this > XalanNode with this name, append this node set, etc.". > > Thanks in advance for any help, > > Emmanuel > >
