On Fri, Oct 20, 2017 at 9:24 AM, Robert Wilton <rwil...@cisco.com> wrote:
> Hi Lada, > > Thanks for the explanation, that makes sense. > > > On 20/10/2017 16:27, Ladislav Lhotka wrote: > >> Hi Rob, >> >> Robert Wilton <rwil...@cisco.com> writes: >> >> Hi, >>> >>> XPATH 1.0 defines the following three node-type tests: >>> >>> 1) comment() >>> 2) processing-instruction(<opt arg>) >>> 3) text() >>> >> For completeness, node() is the fourth one. >> >> My assumption is that a YANG tree doesn't contain any nodes of type >>> 'comment' or 'processing-instruction' and hence these filters would >>> never match any nodes. >>> >> Yes. FWIW, Yangson library raises NotSupported exception upon >> encountering these. >> > But a server or client should ignore PIs, not reject the XML. I think text() and node() are just filter tests. /foo/*[text()] would return all the child nodes of /foo that are leaf or leaf-list text() returns a boolean (0 or 1). Do not use it for value testing: /foo/*[text() = 'fred'] // wrong! /foo/*[. = 'fred'] // correct [7] NodeTest ::= NameTest <https://www.w3.org/TR/1999/REC-xpath-19991116/#NT-NameTest> | NodeType <https://www.w3.org/TR/1999/REC-xpath-19991116/#NT-NodeType> '(' ')' | 'processing-instruction' '(' Literal <https://www.w3.org/TR/1999/REC-xpath-19991116/#NT-Literal> ')' >> However, it wasn't clear to me from reading 7950 or rfc6087bis-14 >>> whether text() matches anything. In particular, does a YANG leaf node >>> (except of type empty) always parent a text node that holds its value? >>> >> I believe this is how it should be interpreted. According to XPath 1.0 >> spec, comparisons like >> >> xyz = 'foo' >> >> use string-value of xyz node, which is defined as the concatenation of >> the string-values of all text node descendants of xyz. >> > Yes. I don't think that I've ever come across for XPath usage in YANG > where the "concatenation of the string-values of all text node descendants > " is actually useful (particularly as the children nodes are likely to not > be consistently ordered). > > I think text() and node() are just filter tests. /foo/*[text()] would return all the child nodes of /foo that are leaf or leaf-list text() returns a boolean (0 or 1). [7] NodeTest ::= NameTest <https://www.w3.org/TR/1999/REC-xpath-19991116/#NT-NameTest> | NodeType <https://www.w3.org/TR/1999/REC-xpath-19991116/#NT-NodeType> '(' ')' | 'processing-instruction' '(' Literal <https://www.w3.org/TR/1999/REC-xpath-19991116/#NT-Literal> ')' [38] NodeType ::= 'comment' | 'text' | 'processing-instruction' | 'node' The node test text() is true for any text node. For example, child::text() will select the text node children of the context node. Similarly, the node test comment() is true for any comment node, and the node test processing-instruction() is true for any processing instruction. The processing-instruction() test may have an argument that is Literal <https://www.w3.org/TR/1999/REC-xpath-19991116/#NT-Literal>; in this case, it is true for any processing instruction that has a name equal to the value of the Literal <https://www.w3.org/TR/1999/REC-xpath-19991116/#NT-Literal>. Thanks, > Rob > > > >> Lada >> >> Andy > Thanks, >>> Rob >>> >>> >>> >>> _______________________________________________ >>> netmod mailing list >>> netmod@ietf.org >>> https://www.ietf.org/mailman/listinfo/netmod >>> >> > _______________________________________________ > netmod mailing list > netmod@ietf.org > https://www.ietf.org/mailman/listinfo/netmod >
_______________________________________________ netmod mailing list netmod@ietf.org https://www.ietf.org/mailman/listinfo/netmod