[ 
https://issues.apache.org/jira/browse/XALANC-596?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Steven J. Hathaway closed XALANC-596.
-------------------------------------

    Resolution: Won't Fix

Incomplete testing.  Resubmit if you need resolution.

                
> Wrong XPath evaluation with queries starting with ".//" when wrapping a 
> Xerces Document
> ---------------------------------------------------------------------------------------
>
>                 Key: XALANC-596
>                 URL: https://issues.apache.org/jira/browse/XALANC-596
>             Project: XalanC
>          Issue Type: Bug
>          Components: XalanC
>    Affects Versions: 1.9, 1.10
>         Environment: WinXP SP 2, VS .Net 2003 (7.1)
>            Reporter: Martin Boucher
>         Attachments: SimpleXPathAPI.cpp, test.xml
>
>
> Context :
>   In the following XML file, I want to select Name nodes based on this XPath 
> query : ".//Object/Name". The context element is the first Project element. 
> With XPathEvaluator::selectNodeList(), I should get a list with only one 
> node, I got two.
> --------------------------------------------------------------------------------------
> <?xml version="1.0" encoding="UTF-16" standalone="no" ?>
> <Projects>
>   <Project>
>     <Branch>
>       <Object>
>         <Name xml:space="preserve">one</Name>
>       </Object>
>     </Branch>
>   </Project>
>   <Project>
>     <Branch>
>       <Object>
>         <Name xml:space="preserve">two</Name>
>       </Object>
>     </Branch>
>   </Project>
> </Projects>
> --------------------------------------------------------------------------------------
> To verify my XPath expression, I've tried the sample SimpleXPathAPI with the 
> command line :
> SimpleXPathAPI "path to the XML file" "//Project" ".//Object/Name"
> It correctly output "one". The XPath expression "//Project" to obtain the 
> context node is evaluated with selectSingleNode. So the first Project node 
> matched by the query is used as the context node.
> The difference between the SimpleXPathAPI sample and our code is that we used 
> a Xerces wrapper for the input document. I've made little changes to the 
> sample to obtain code that is very close to what we really do. In the sample, 
> there is 3 steps :
> 1- parse a XML file (arg 1) and get a Xalan Document
> 2- evaluate a XPath expression (arg 2) to get the context node
> 3- from the context node, evaluated a XPath expression (arg 3 ) and output 
> the result on stdout.
> I've changed these steps by :
> 1- parse a XML file (arg 1) and get a Xerces Document. Wrap it to get a 
> XalanDocument*.
> 2- obtain the first Project node from the Xerces Document (no need of arg 2). 
> Wrap this Project node to get a context in a XalanNode* interface. This step 
> is hardcoded to be closest of the real code we use. We already have the 
> context node in DOMElement* interface. If we let the step 2 of the original 
> sample, that is, evaluate the XPath expression (arg 2) to get the context 
> node, that works. Only one element Name is output.
> 3- this step is replaced by a "selectListNode" that should get 1 element.
> Here is a code snippet of the modified sample. This code replace the sample 
> code from SimpleXPathAPI right after initializations.
> //1- parse a XML file (arg 1) and get a Xerces Document. 
> const XalanDOMString  theFileName(argv[1]);
> LocalFileInputSource inputSrc_( theFileName.c_str() );
> XercesDOMParser parser;
> parser.parse( inputSrc_ );
> DOMDocument* pXercesDOMDoc = parser.getDocument();
> pXercesDOMDoc->normalizeDocument();
> DOMElement* pDocumentElement = pXercesDOMDoc->getDocumentElement();
> if( pDocumentElement == NULL )
> {
>     return false;
> }
> //(1- continued) Wrap it to get a XalanDocument*.
> XercesParserLiaison xercesParserLiaison;
> XalanDocument* pXalanDoc = xercesParserLiaison.createDocument( pXercesDOMDoc, 
> false, true, true );
> // 2- Get the context node. We go hardcoded way to really works on a 
> Xerces::DOMElement* to
> // be the closest as we can of our real code. The context node we want is the 
> first Project element.
> // We have tho skip the first child of the document element because it is a 
> text node (the XML is
> // indented).
> DOMNode* pFirstNode = pDocumentElement->getFirstChild();
> pFirstNode = pFirstNode->getNextSibling();
> DOMElement* pFirstProject = dynamic_cast< DOMElement* >( pFirstNode );
> if( pFirstProject == NULL )
> {
>     return 1;
> }
> const XMLCh *name = pFirstProject->getNodeName(); // Just to verify that name 
> == "Project".
> // (2- continued) Wrapping this DOMElement to get a XalanNode*.
> XercesDocumentWrapper* pXercesDocWrapper = dynamic_cast< 
> XercesDocumentWrapper* >( pXalanDoc );
> assert( pXercesDocWrapper != NULL );
> XercesWrapperNavigator navigator( pXercesDocWrapper );
> XercesElementWrapper   contextNode( pFirstProject, navigator );
> XalanNode* const theContextNode = &contextNode;
> XalanDocumentPrefixResolver thePrefixResolver(pXalanDoc);
> // 3- Query evaluation of ".//Object/Name".
> XercesDOMSupport xercesDOMSupport;
> NodeRefList      nodeList;
> XPathEvaluator        theEvaluator;
> theEvaluator.selectNodeList( nodeList, xercesDOMSupport, theContextNode, 
> XalanDOMString(argv[3]).c_str(), thePrefixResolver );
> const NodeRefList::size_type NB_ELEM = nodeList.getLength(); // BUG HERE, 
> receive 2 elements instead of 1.
> By doing many tests, I can tell that if the XML file has, exemple, 5 Project 
> elements, applying the query on the first Project leads to 5 Name selected. 
> Applying the query on the second Project element leads to 4 Name and so on.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-dev-unsubscr...@xml.apache.org
For additional commands, e-mail: xalan-dev-h...@xml.apache.org

Reply via email to