Indrajit Bhattacharya wrote:
Hi Dave,
I want to achieve the following:
I have a XercesDOM document object. There is an XPath expression like
the following, for
, say, one attribute's value: cube(id('id1')). Here, id() is the XPath
function, id1 is the id of an element
whose value is, say, 10. Cube is a function that I want to implement. I
have to get the result 1000
when this XPath expression is evaluated.
Please note that I should not have to have any XSL file. Everything has
to be done in-memory.
Also, I need not do any transform on the input document. Only what I
need to do is get the XPath
expression evaluated to get the correct value.
I have the following code. It returns correct value for id('id1'), but
for cube(id('id1')) it throws
xalanc::XPathParserException exception.
Yes, because XPath does not define a function called cube. You need to map
your function's namespace to a particular prefix, and use that in the XPath
expression. You can see how this works by looking at the stylesheet for
the sample you've copied.
I will be grateful if you could please let me know where I am doing stuffs
wrong, and how to do it correctly to get the desired output.
Code:
...
...
int foo(xercesc::DOMDocument *dom_document_, char* xpath, std::string&
output)
{
XMLPlatformUtils::Initialize();
XalanTransformer::initialize();
XPathEvaluator::initialize();
{
// Create a XalanTransformer.
XalanTransformer theXalanTransformer;
const XalanDOMString theNamespace(" ");
A space is not a legal namespace URI. It might work, but it might not.
You should choose a better URI.
theXalanTransformer.installExternalFunction(
theNamespace,
XalanDOMString("cube"),
FunctionCube());
XercesDOMSupport theDOMSupport;
XercesParserLiaison theParserLiaison(theDOMSupport);
XalanDocument* theDocument =
theParserLiaison.createDocument(
dom_document_,
true,
true,
true);
XPathEvaluator theEvaluator;
const XalanElement* const theRootElement =
theDocument->getDocumentElement();
ElementPrefixResolverProxy
thePrefixResolver(theRootElement);
An element prefix resolver will not work, because you need to associate a
prefix for the cube function with the namespace you used when you installed
the extension function. You will need to write your own PrefixResolver
implementation that can resolve the prefix you've chosen to the correct
namespace URI, or, if it can't, pass the request on to another PrefixResolver.
Dave