[ http://issues.apache.org/jira/browse/XALANJ-1630?page=all ]

Brian Minchau updated XALANJ-1630:
----------------------------------

    Version: Latest Development Code
                 (was: 2.5)

> XPath expresssion does not work against cloned node
> ---------------------------------------------------
>
>          Key: XALANJ-1630
>          URL: http://issues.apache.org/jira/browse/XALANJ-1630
>      Project: XalanJ2
>         Type: Bug
>   Components: XPath
>     Versions: Latest Development Code
>  Environment: Operating System: Windows XP
> Platform: PC
>     Reporter: Gary Hirschhorn
>     Assignee: Xalan Developers Mailing List

>
> I am using XPathAPI to select nodes using a simple XPath expression.  It 
> works 
> fine when the context node is part of a Document, but if I make a deep clone 
> of that node and use the same XPath expression, nothing is returned.  I 
> tested 
> this against Java 2 SDK 1.4.2, Xalan 2.5.1, and Xerces 2.5.0.  
> I have attached sample code below that demonstrates the problem.
> I realize that the current behavior may be the desired one (i.e., the methods 
> only work against nodes that have parents), but the method signature and 
> javadoc do not mention this. Also, there are other expressions that do work 
> against the cloned node (e.g., "//state").  Finally, if the context node 
> truly 
> must have a parent, then perhaps an Exception should be thrown if this is not 
> the case.
> ==========================================
> SAMPLE CODE
> ==========================================
> import java.io.*;
> import javax.xml.parsers.*;
> import org.w3c.dom.*;
> import org.w3c.dom.traversal.*;
> import org.apache.xpath.*;
> import org.xml.sax.InputSource;
>  
> public class Test {
>   public static void main(String[] args) throws Throwable{
>     String xmlString = "<root><state>California</state></root>";
>     DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance
> ();
>     DocumentBuilder builder = builderFactory.newDocumentBuilder();
>     Document xmlDoc = builder.parse(new InputSource(new StringReader
> (xmlString)));
>     Element root = xmlDoc.getDocumentElement();
>     Node rootClone = root.cloneNode(true);
>     
>     String xpath= "//root/state";   
> //    String xpath= "//state";   
> //    String xpath= "state";   
>     
>     System.out.println("Applying XPath to root -- expecting to find one 
> node.");
>     applyXPath(root, xpath);
>     
>     System.out.println("Applying XPath to root clone  -- expecting to find 
> one 
> node.");
>     applyXPath(rootClone, xpath);
>     xmlDoc.removeChild(root);
>     xmlDoc.appendChild(rootClone);
>     System.out.println("Applying XPath to root clone after adding to Document 
> -
> - expecting to find one node.");
>     applyXPath(rootClone, xpath);
>   }
>   private static void applyXPath(Node node, String xpath) throws Throwable{
>     NodeIterator ni = XPathAPI.selectNodeIterator(node, xpath);
>     Node selected;
>     while ((selected = ni.nextNode()) != null){
>       System.out.println("Selected: " + selected.getNodeName());
>     }
>   }
> }
> ==========================================
> OUTPUT
> ==========================================
> Applying XPath to root -- expecting to find one node.
> Selected: state
> Applying XPath to root clone  -- expecting to find one node.
> Applying XPath to root clone after adding to Document -- expecting to find 
> one 
> node.
> Selected: state

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


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

Reply via email to