Hi, there.

I also needed such functionality badly, and ended up writing my own method.
As I would appreciate someone having a look at this and maybe distribution
with the Xalan XPath API.

Anyway, here is my code:
----------------------------------------8<-----------
    /**
     * Returns the position of the node within the list of the parent's
children.
     * @param node The node whose position shall be calculated.
     * @return Position of the node. The first node has position=1 so these
values can be used
     * directly with XPath expressions.
     */
    public static int getNodePosition(Node node) {
        Node parent = node.getParentNode();
        if(parent==null)
            return 1;
        
        NodeList nl = parent.getChildNodes();
        for(int i=0;i<nl.getLength();i++) {
            if(nl.item(i)==node)
                return i+1;
        }
        return -1;
    }
    
    /**
     * Returns the position of the node within the list of the parent's
children.
     * This method counts only the nodes of the specified type.
     * @param node The node whose position shall be calculated.
     * @return Position of the node. The first node has position=1 so these
values can be used
     * directly with XPath expressions.
     */
    public static int getNodePosition(Node node, short nodetype) {
        Node parent = node.getParentNode();
        if(parent==null)
            return 1;
        
        NodeList nl = parent.getChildNodes();
        int pos = nl.getLength()-1;
        while(nl.item(pos)!=node)
            pos--;
        
        int count=pos-1;
        while(count>=0) {
            if(nl.item(count).getNodeType()!=nodetype)
                pos--;
            count --;
        }
        return pos+1;   //index is 1-based
    }
    
    /**
     * Returns the position of the node within the list of the parent's
children.
     * This method counts only the nodes with the given node name.
     * @param node The node whose position shall be calculated.
     * @return Position of the node. The first node has position=1 so these
values can be used
     * directly with XPath expressions.
     */
    public static int getNodePosition(Node node, String nodeName) {
        Node parent = node.getParentNode();
        if(parent==null)
            return 1;
        
        NodeList nl = parent.getChildNodes();
        int pos = nl.getLength()-1;
        while(nl.item(pos)!=node)
            pos--;
        
        int count=pos-1;
        while(count>=0) {
            if(!nl.item(count).getNodeName().equals(nodeName))
                pos--;
            count --;
        }
        return pos+1;   //index is 1-based
    }
    
    public static String getLocationPath(Node node) {
        return getLocationPath(node, null);
    }
    
    public static String getLocationPath(Node node, Node context) {
        if(node==null)
            return null;
        
        String result;
        
        if(node==context)
            return ".";
        
        switch(node.getNodeType()) {
            case Node.DOCUMENT_NODE:
                result = "";
                break;
            case Node.ELEMENT_NODE:
                result = getLocationPath(node.getParentNode(), context) +
"/"+node.getNodeName()+"["+getNodePosition(node, node.getNodeName())+"]";
                break;
            case Node.TEXT_NODE:
                result = getLocationPath(node.getParentNode(), context) +
"/text()["+getNodePosition(node, org.w3c.dom.Node.TEXT_NODE)+"]";
                break;
            default:
                result = getLocationPath(node.getParentNode(), context) +
"/*["+getNodePosition(node)+"]";
        }
        
        return result;
    }
    
    ---------------------------------------->8-----------


> -----Urspr�ngliche Nachricht-----
> Von: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]]
> Gesendet: Dienstag, 27. November 2001 01:47
> An: [EMAIL PROTECTED]
> Betreff: Re: XPath for a node
> 
> 
> 
> >     Is there any support in Xerces API to get the XPath 
> value for a node
> > in a XML document?
> 
> There's been lots of discussion about providing an XPath 
> generating utility
> function, but I don't think anyone has ever gotten around to 
> contributing
> one. The basic logic I'd try would be something like the following
> (untested!) pseudocode:
> 
>      buffer=""
>      while(thisnode.getNodeType()!=DOCUMENT_NODE)
>      {
>           count=0;
>           name=thisnode.getNodeName();
>           for(prevsib=thisnode.getPreviousSibling();
>               prevsib!=null;
>               prevsib=prevsib.getPreviousSibling())
>           {
>                if(name.equals(prevsib.getNodeName())
>                     ++count;
>           }
>           buffer="/"+name+"["+count+"]"+buffer;
>      }
> 
> As sketched that only works for elements; it'd have to be 
> refined to deal
> with starting from other kinds of nodes. This sketch isn't 
> namespace-aware;
> that'd also have to be fixed. And of course it assumes the 
> node is in the
> main document tree; if it's part of an orphaned subtree or a
> DocumentFragment tree, you'd have to decide how best to 
> represent that.
> 
> A few days's hacking ought to be all that's needed, though. 
> Good project
> for someone who's reasonably familiar with the DOM and wants 
> to become more
> familiar with XPath to tackle and contribute to Xalan...
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to