Hi Gary,

Ouh, I'm little kind of stuupid - I used Xalan 2.2.D7 and not D9..... D7 created this 
NullPointerEx:

----
Registered class org.xmlsecurity.temp.FuncHere for here() function in internal table
FuncHere.execute() has been called
#NODESET
java.lang.NullPointerException
        at org.apache.xml.dtm.ref.DTMNodeIterator.nextNode(DTMNodeIterator.java:198)
        at org.xmlsecurity.temp.FuncHere.main(FuncHere.java:141)
Exception in thread "main"
----

Thanks for your help,
Christian

> This works fine for me.  I had to put the class in a package because
> XalanJ assumes that anything registered without a package name is in its
> own functions package.
>
> My output is:
>
> C:\Temp>java foo.FuncHere
> Registered class foo.FuncHere for here() function in internal table
> FuncHere.execute() has been called
> #NODESET
> xpath
>
> Gary
>
> Christian Geuer-Pollmann wrote:
>>
>> /*
>>  * Hi Xalan-Gurus,
>>  * dear Gary,
>>  *
>>  * My extension function crashes (and i programmed some things that I
>>  took * from the org.apache.xpath.functions package but did not
>>  understood completely).
>>  *
>>  * Could you please have a short (or longer) look at the code and give me
>> some advise?
>>  *
>>  * Regards,
>>  * Christian
>>  *
>>  * @author <mailto:[EMAIL PROTECTED]>
>>  */
>>
>> import java.io.*;
>> import java.util.*;
>> import javax.xml.parsers.DocumentBuilder;
>> import javax.xml.parsers.DocumentBuilderFactory;
>> import org.apache.xalan.extensions.*;
>> import org.apache.xalan.templates.*;
>> import org.apache.xerces.dom.*;
>> import org.apache.xml.utils.*;
>> import org.apache.xml.dtm.*;
>> import org.apache.xpath.*;
>> import org.apache.xpath.objects.*;
>> import org.apache.xpath.functions.Function;
>> import org.apache.xpath.compiler.FunctionTable;
>> import org.apache.xpath.res.XPATHErrorResources;
>> import org.w3c.dom.*;
>> import org.w3c.dom.traversal.NodeIterator;
>>
>> /**
>>  * The here function returns a node-set containing the attribute or
>>  * processing instruction node or the parent element of the text node
>>  * that directly bears the XPath expression.  This expression results
>>  * in an error if the containing XPath expression does not appear in the
>>  * same XML document against which the XPath expression is being
>>  evaluated. *
>>  * Mainpart is stolen from FuncId.java
>>  *
>>  * @see
>> http://www.w3.org/Signature/Drafts/xmldsig-core/Overview.html#function-h
>> ere */
>> public class FuncHere extends Function {
>>
>>    public XObject execute(XPathContext xctxt)
>>            throws javax.xml.transform.TransformerException {
>>
>>       System.out.println("FuncHere.execute() has been called");
>>
>>       int currentNode = xctxt.getCurrentNode();
>>       DTM dtm = xctxt.getDTM(currentNode);
>>       int docContext = dtm.getDocument();
>>
>>       if (DTM.NULL == docContext) {
>>          error(xctxt, XPATHErrorResources.ER_CONTEXT_HAS_NO_OWNERDOC,
>>          null); }
>>
>>       XNodeSet nodes = new XNodeSet(xctxt.getDTMManager());
>>       NodeSetDTM nodeSet = nodes.mutableNodeset();
>>
>>       // Do processing here
>>       {
>>          int contextNode = xctxt.getContextNode();
>>          int hereNode;
>>          if (dtm.getNodeType(contextNode) == Node.ATTRIBUTE_NODE) {
>>             hereNode = contextNode;
>>          } else if (dtm.getNodeType(contextNode) ==
>> Node.PROCESSING_INSTRUCTION_NODE) {
>>             hereNode = contextNode;
>>          } else if (dtm.getNodeType(contextNode) == Node.TEXT_NODE) {
>>             hereNode = dtm.getParent(contextNode);
>>          } else {
>>             hereNode = DTM.NULL;
>>          }
>>
>>          if (DTM.NULL != hereNode) {
>>             nodeSet.addNode(hereNode);
>>          }
>>       }
>>
>>       // must I do this detach() ?
>>       nodeSet.detach();
>>       return nodes;
>>    }
>>
>>    /**
>>     * No arguments to process, so this does nothing.
>>     * @param vars
>>     * @param globalsSize
>>     */
>>    public void fixupVariables(java.util.Vector vars, int globalsSize) {}
>>
>>    /**
>>     * Method main
>>     *
>>     * @param unused
>>     * @throws Exception
>>     */
>>    public static void main(String unused[]) throws Exception {
>>
>>       String thisClass = FuncHere.class.getName();
>>
>>       /**
>>        * Try to register out here() implementation as internal function.
>>        * @todo Is this too much hardcore?
>>        */
>>       FunctionTable.installFunction("here", new FuncHere());
>>       System.out.println("Registered class " + thisClass
>>                          + " for here() function in internal table");
>>
>>       //J-
>>       String input =
>>         "<?xml version='1.0' encoding='UTF-8' ?>\n"
>>       + "<!DOCTYPE root [\n"
>>       + "<!ATTLIST XPath\n"
>>       + "          Id      ID      #REQUIRED>\n"
>>       + "]>\n"
>>       + "<root>\n"
>>       + "   <XPath Id='hereInText'>here()</XPath>\n"
>>       + "   <XPath Id='hereInAttr' xpath='here()' />\n"
>>       + "</root>";
>>       //J+
>>       DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
>>
>>       dbf.setNamespaceAware(true);
>>
>>       DocumentBuilder db = dbf.newDocumentBuilder();
>>       Document doc = db.parse(new
>>       ByteArrayInputStream(input.getBytes())); Node a =
>>       XPathAPI.selectSingleNode(doc, "/root/XPath[2]"); Node attr =
>>       ((Element) a).getAttributeNode("xpath");
>>       XObject o = XPathAPI.eval(attr, attr.getNodeValue());
>>
>>       System.out.println(o.getTypeString());
>>
>>       if (o.getType() == XObject.CLASS_NODESET) {
>>          NodeIterator ni = o.nodeset();
>>          Node currNode;
>>
>>          while ((currNode = ni.nextNode()) != null) {
>>             System.out.println(currNode.getNodeName());
>>          }
>>       }
>>    }
>> }






Mit freundlichen Gr��en,

Christian Geuer-Pollmann


--------------------------------------------------------------------------
Institute for Data Communications Systems             University of Siegen
Hoelderlinstrasse 3                 D-57068 Siegen                 Germany

mail:  mailto:[EMAIL PROTECTED]
web:  <http://www.nue.et-inf.uni-siegen.de/~geuer-pollmann/>

Reply via email to