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