We welcome you to a discussion already in progress. Dan Allen (that's me) brought up the issue that in the domxml extension, the xpath_eval function does not allow you to begin the query relative to a given node, as is possible in both the libxml2 libraries and as we are so familiar with, in xslt. It is simply a matter of having either a function called
xpath_set_context_node() or more simply a second parameter passed to xpath_eval() that allows you to specify your "current" node. This way, if you did the expression '*' it would find the children relative to the starting point, hence it would be a relative xpath expression. You will find below the discussion, hopefully this feature can be given attention in the near future. Daniel Veillard ([EMAIL PROTECTED]) wrote: > On Wed, Jun 05, 2002 at 01:18:47AM -0700, Dan Allen wrote: > > I have a question about xpath that I can't seem to resolve after > > looking through the documentation for libxml2. If I am to setup a > > new xpath context and then run xpathEval it assumes that when I run > > my query, I am starting from the top of the document. However, in > > xslt, when you run a select, you often use use a relative > > query...such as > > > > <xsl:template match="nodeName"> > > <xsl:apply-templates select="*"/> > > </xsl:template> > > > > So effectively no matter where you are in the document you can run a > > query relative to that position in xslt. I was thinking, this could be > > solved easy enough for domxml if there was a method on a node called > > > > getXPathLocation > > Indeed there is, and it is called xmlGetNodePath > > /** > * xmlGetNodePath: > * @node: a node > * > * Build a structure based Path for the given node > * > * Returns the new path or NULL in case of error. The caller must free > * the returned string > */ > xmlChar * > xmlGetNodePath(xmlNodePtr node) > > > or something that just works recursively up until you get the the > > root of the document...sort of like in unix when you type > > > > pwd > > > > you get your current path... You might have done > > > > cd /var/log/../../home/dallen/../../usr/share > > > > but your present working directory will still come up as /usr/share > > So then you could just say... > > > > $ctx->xpath_eval('*', $node->xpathLocation); > > > > Where $node is just an DOMElement object for example and the second > > parameter to xpath_eval is a path which is appened to the query...or > > maybe just require that the user paste the query together himself. > > Would it be slower to have to look through the whole document > > though? Maybe by passing in the context location, you can speed up > > the query by eliminating the current location and just starting from > > there. > > yes to set up the current node (or current doc) for an XPath query > you need to access the XPath context and set those informations: > > xmlXPathContextPtr ctx; > > ctx->doc = my_document; > ctx->node = my_current_node; > > > I'm I way off here or do I sound like I make some sense? I am not > > makes some sense, yes. > > Daniel > > -- > Daniel Veillard | Red Hat Network http://redhat.com/products/network/ > [EMAIL PROTECTED] | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ > http://veillard.com/ | Rpmfind RPM search engine http://rpmfind.net/ -- ________________________________________________________________ Daniel Allen, <[EMAIL PROTECTED]> http://www.mojavelinux.com/ ________________________________________________________________ "I used to herd dairy cows. Now I herd linux users. Apart from the isolation, I think I preferred the cows. They were better in conversation, easier to milk, and if they annoyed me enough, I could shoot them and eat them." ________________________________________________________________ -- PHP Development Mailing List <http://www.php.net/> To unsubscribe, visit: http://www.php.net/unsub.php