[ http://issues.apache.org/jira/browse/XALANC-540?page=all ]
     
David Bertoni resolved XALANC-540:
----------------------------------

    Fix Version: CurrentCVS
     Resolution: Fixed

Patch committed.

> XPath absolute location path does not work when the context node was obtained 
> from a result tree fragment through exsl:node-set()
> ---------------------------------------------------------------------------------------------------------------------------------
>
>          Key: XALANC-540
>          URL: http://issues.apache.org/jira/browse/XALANC-540
>      Project: XalanC
>         Type: Bug
>   Components: XPathC
>     Versions: CurrentCVS, 1.8, 1.9
>  Environment: Win2k on ix86.
>     Reporter: Alain Le Guennec
>     Assignee: David Bertoni
>      Fix For: CurrentCVS
>  Attachments: patch.txt
>
> XPath absolute location path does not work when the context node was obtained 
> from a result tree fragment through exsl:node-set().
> Consider the following stylesheet (applied to any input document, the actual 
> input does not matter):
> <?xml version="1.0"  encoding = "ISO-8859-1"?>
> <xsl:stylesheet version="1.0" 
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; 
> xmlns:exsl="http://exslt.org/common";>
>       <xsl:template match="/">
>               <xsl:variable name="var-rtf">
>                       <foo>
>                               <bar/>
>                       </foo>
>               </xsl:variable>
>               <xsl:variable name="var" select="exsl:node-set($var-rtf)/*"/>
>               <xsl:apply-templates select="$var">
>                       <xsl:with-param name="root" select="$var"/>
>               </xsl:apply-templates>
>       </xsl:template>
>       <xsl:template match="foo">
>               <xsl:param name="root"/>
>               <!-- Here the context node belongs to the tree fragment -->
>               <xsl:variable name="count-from-implicit-root" 
> select="count(//*)"/><!-- Does not work! -->
>               <xsl:variable name="count-from-explicit-root" 
> select="count($root/descendant-or-self::node())"/><!-- OK -->
>               <xsl:choose>
>                       <xsl:when test="$count-from-implicit-root = 
> $count-from-explicit-root">
>                               <xsl:message>No bug: There are <xsl:value-of 
> select="$count-from-implicit-root"/> elements in the tree 
> fragment.</xsl:message>
>                       </xsl:when>
>                       <xsl:otherwise>
>                               <!-- Navigation from the root of the tree 
> fragment does not work. -->
>                               <xsl:message>Bug: There should be <xsl:value-of 
> select="$count-from-explicit-root"/> elements in the tree fragment, not 
> <xsl:value-of select="$count-from-implicit-root"/>.</xsl:message>
>                       </xsl:otherwise>
>               </xsl:choose>
>       </xsl:template>
> </xsl:stylesheet>
> Executing this stylesheet prints
>     "Bug: There should be 2 elements in the tree fragment, not 0."
> where as it should print
>     "No bug: There are 2 elements in the tree fragment."
> Apparently, the error lies in XPath.cpp, in function XPath::findRoot().
> I think it's because the XalanNodes representing the elements are connected
> to the XalanSourceTreeDocumentFragment, not to its owning 
> XalanSourceTreeDocument.
> In this particular case, the actual root is not a DOCUMENT_NODE, but a 
> DOCUMENT_FRAGMENT_NODE.
> Here is modified version of findRoot() that apparently fixes the problem (old 
> code kept as comment):
> XPath::OpCodeMapPositionType
> XPath::findRoot(
>                       XPathExecutionContext&  /* executionContext */,
>                       XalanNode*                              context, 
>                       OpCodeMapPositionType   opPos,
>                       OpCodeMapValueType              /* stepType */,
>                       MutableNodeRefList&     subQueryResults) const
> {
>       assert(subQueryResults.empty() == true);
>       const XPathExpression&  currentExpression = getExpression();
>       const OpCodeMapValueType    argLen =
>               currentExpression.getOpCodeArgumentLength(opPos);
> //    XalanNode* const        docContext = XalanNode::DOCUMENT_NODE == 
> context->getNodeType() ?
> //                                                                    context 
> :
> //                                                                    
> context->getOwnerDocument();
>       XalanNode* docContext = context;
>       while (docContext->getNodeType() != XalanNode::DOCUMENT_NODE && 
> docContext->getNodeType() != XalanNode::DOCUMENT_FRAGMENT_NODE) {
>               docContext = DOMServices::getParentOfNode(*docContext);
>       }
>       assert(docContext != 0);
>       subQueryResults.addNode(docContext);
>       subQueryResults.setDocumentOrder();
>       return opPos + argLen + 3;
> }
> Hope this helps.
> Regards,
> Alain Le Guennec.

-- 
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