"Dimitre Novatchev" wrote:
>
> "David Thielen" <david@bogus.windward.net> wrote in message
> news:DA492C31-ACA4-4280-8A88-78C729376EAA@microsoft.com...
> > Hi;
> >
> > First, thanks for helping on this I really appreciate it.
> >
> > Ok, I see that the xpath must start with "." to get it to the node and the
> > "[...]" then modifies that - makes sense.
> >
> > But then, shouldn't ".[.='software']" or "./.[.='software']" or
>
> No, the syntax rules do not allow this:
>
> >> [4] Step ::= AxisSpecifier NodeTest Predicate*
> >> | AbbreviatedStep
>
> as we can see, Predicatecan only occur after a NodeTest , not after an
> AbbreviatedStep.
>
> > "./[.='software']" work.
>
> Again, Predicate cannot be the leftmost symbol in a step
>
> >
> > In the case of ".[.='software']" isn't that saying start with the node "."
> > (which exists) and then return all where .='software'?
>
> This may seem a clear semantics, but the syntax is invalid according to the
> XPath 1.0 grammar rules.
>
> As I said, use:
>
> self::node()[.='software']
>
>
>
> Cheers,
> Dimitre Novatchev
>
> >
> > --
> > thanks - dave
> > david_at_windward_dot_net
> >
http://www.windwardreports.com > >
> >
> >
> > "Dimitre Novatchev" wrote:
> >
> >>
> >> "David Thielen" <david@bogus.windward.net> wrote in message
> >> news:24EA7468-C52A-4765-B556-1EE1DCF81F1B@microsoft.com...
> >> > Hello;
> >> >
> >> > I assumed it is invalid syntax. My question is why? I don't understand
> >> > why
> >> > "[.='software']" or some variation of that is invalid.
> >>
> >> Read the XPath 1.0 Spec.
> >>
> >> It says:
> >>
> >>
http://www.w3.org/TR/xpath#predicates > >>
> >> "A predicate filters a node-set with respect to an axis to produce a new
> >> node-set. For each node in the node-set to be filtered, the PredicateExpr
> >> is
> >> evaluated with that node as the context node, with the number of nodes in
> >> the node-set as the context size, and with the proximity position of the
> >> node in the node-set with respect to the axis as the context position; if
> >> PredicateExpr evaluates to true for that node, the node is included in
> >> the
> >> new node-set; otherwise, it is not included."
> >>
> >>
> >>
> >> So, a predicate can only apear after some XPath expression and filters
> >> it. A
> >> predicate, alone, is not a valid XPath expression.
> >>
> >> This is also made clear if we look at the BNF grammar definition of XPath
> >> 1.0. Of all rules only rule [4] and rule [20] contain the nonterminal
> >> symbol
> >> predicate and it is always not the leading symbol (of the RHS):
> >>
> >>
> >>
> >>
http://www.w3.org/TR/xpath#section-Location-Steps > >>
> >>
> >> [4] Step ::= AxisSpecifier NodeTest Predicate*
> >> | AbbreviatedStep
> >>
> >>
> >>
> >>
> >>
http://www.w3.org/TR/xpath#node-sets > >>
> >>
> >>
> >> [20] FilterExpr ::= PrimaryExpr
> >> | FilterExpr Predicate
> >>
> >>
> >>
> >>
> >> I hope that this answers completely your question.
> >>
> >>
> >> Cheers,
> >> Dimitre Novatchev
> >>
> >>
> >>
> >> >
> >> > --
> >> > thanks - dave
> >> > david_at_windward_dot_net
> >> >
http://www.windwardreports.com > >> >
> >> >
> >> >
> >> > "Dimitre Novatchev" wrote:
> >> >
> >> >> > // these all fail - WHY?
> >> >>
> >> >> because of a common feature -- they all have invalid XPath syntax.
> >> >>
> >> >> > try
> >> >> > {
> >> >> > rtn = nav.SelectSingleNode("[.='software']");
> >> >> > }
> >> >> > catch (XPathException ex)
> >> >> > {
> >> >> > Console.Out.WriteLine("[.='software'] exception = " + ex.Message);
> >> >> > }
> >> >> > try
> >> >> > {
> >> >> > rtn = nav.SelectSingleNode("./[.='software']");
> >> >> > }
> >> >> > catch (XPathException ex)
> >> >> > {
> >> >> > Console.Out.WriteLine("./[.='software'] exception = " + ex.Message);
> >> >> > }
> >> >> >
> >> >> > // yes this works - but I need the node as it does have a value.
> >> >> > object obj = nav.Evaluate(".='software'");
> >> >> > Console.Out.WriteLine(".='software' evaluate = " + obj);
> >> >>
> >> >>
> >> >> Try:
> >> >>
> >> >> "self::*[.='software']"
> >> >>
> >> >> or
> >> >>
> >> >> "string(self::*[.='software'])"
> >> >>
> >> >> depending on whether you need the node or its string value returned.
> >> >>
> >> >>
> >> >> Cheers,
> >> >> Dimitre Novatchev
> >> >>
> >> >>
> >> >>
> >> >>
> >> >>
> >> >> "David Thielen" <david@bogus.windward.net> wrote in message
> >> >> news:741F026C-54CD-4B6D-BDD8-0FA03A7E06D1@microsoft.com...
> >> >> > Hi;
> >> >> >
> >> >> > I am sure I am missing something here but I cannot figure it out.
> >> >> > Below
> >> >> > I
> >> >> > have a program and I cannot figure out why the xpath selects that
> >> >> > throw
> >> >> > an
> >> >> > exception fail. From what I know they should work.
> >> >> >
> >> >> > Also the second nav.OuterXml appears to also be wrong to me.
> >> >> >
> >> >> > Can someone explain to me why this does not work? (This is an
> >> >> > example
> >> >> > from
> >> >> > a
> >> >> > program we have where xpath can be entered in two parts so we have
> >> >> > to
> >> >> > be
> >> >> > able
> >> >> > to handle this. We can't just always require the fill
> >> >> > /order/product[.='software'].)
> >> >> >
> >> >> > Program below sig.
> >> >> >
> >> >> > --
> >> >> > thanks - dave
> >> >> > david_at_windward_dot_net
> >> >> >
http://www.windwardreports.com > >> >> >
> >> >> > Program.cs:
> >> >> > using System.Xml;
> >> >> > using System.Xml.XPath;
> >> >> > using System;
> >> >> > using System.IO;
> >> >> >
> >> >> > namespace XPathSample
> >> >> > {
> >> >> > class Program
> >> >> > {
> >> >> > static void Main(string[] args)
> >> >> > {
> >> >> >
> >> >> > string xml =
> >> >> > "<order>" +
> >> >> > "<product>software</product>" +
> >> >> > "<product>software</product>" +
> >> >> > "</order>";
> >> >> > XPathDocument doc = new XPathDocument(new StringReader(xml));
> >> >> >
> >> >> > // this works
> >> >> > XPathNavigator nav = doc.CreateNavigator();
> >> >> > XPathNavigator rtn =
> >> >> > nav.SelectSingleNode("/order/product[.='software']");
> >> >> > Console.Out.WriteLine("nav(/) = " + nav.OuterXml);
> >> >> > Console.Out.WriteLine("/order/product[.='software'] = " +