Re: [netmod] XPath node type tests

Martin Bjorklund <mbj@tail-f.com> Mon, 23 October 2017 11:38 UTC

Return-Path: <mbj@tail-f.com>
X-Original-To: netmod@ietfa.amsl.com
Delivered-To: netmod@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id EF88B13F3C7 for <netmod@ietfa.amsl.com>; Mon, 23 Oct 2017 04:38:18 -0700 (PDT)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -1.901
X-Spam-Level:
X-Spam-Status: No, score=-1.901 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, SPF_PASS=-0.001] autolearn=ham autolearn_force=no
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id H432G7Jk_fUX for <netmod@ietfa.amsl.com>; Mon, 23 Oct 2017 04:38:17 -0700 (PDT)
Received: from mail.tail-f.com (mail.tail-f.com [46.21.102.45]) by ietfa.amsl.com (Postfix) with ESMTP id 427D413F3C3 for <netmod@ietf.org>; Mon, 23 Oct 2017 04:38:17 -0700 (PDT)
Received: from localhost (unknown [173.38.220.41]) by mail.tail-f.com (Postfix) with ESMTPSA id 41EDE1AE012C; Mon, 23 Oct 2017 13:38:16 +0200 (CEST)
Date: Mon, 23 Oct 2017 13:36:50 +0200 (CEST)
Message-Id: <20171023.133650.1291300163395090798.mbj@tail-f.com>
To: lhotka@nic.cz
Cc: rwilton@cisco.com, netmod@ietf.org
From: Martin Bjorklund <mbj@tail-f.com>
In-Reply-To: <EF2E5EFA-514B-47CC-86EF-59054442C208@nic.cz>
References: <93844bdb-dcd9-758e-f58a-4cad047d4fd7@cisco.com> <20171023.123734.1274882060625273119.mbj@tail-f.com> <EF2E5EFA-514B-47CC-86EF-59054442C208@nic.cz>
X-Mailer: Mew version 6.7 on Emacs 24.5 / Mule 6.0 (HANACHIRUSATO)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Archived-At: <https://mailarchive.ietf.org/arch/msg/netmod/ZqnGu1lf4Ygajr5cl4pht6e5IVE>
Subject: Re: [netmod] XPath node type tests
X-BeenThere: netmod@ietf.org
X-Mailman-Version: 2.1.22
Precedence: list
List-Id: NETMOD WG list <netmod.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/netmod>, <mailto:netmod-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/netmod/>
List-Post: <mailto:netmod@ietf.org>
List-Help: <mailto:netmod-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/netmod>, <mailto:netmod-request@ietf.org?subject=subscribe>
X-List-Received-Date: Mon, 23 Oct 2017 11:38:19 -0000

Ladislav Lhotka <lhotka@nic.cz> wrote:
> 
> > On 23 Oct 2017, at 12:37, Martin Bjorklund <mbj@tail-f.com> wrote:
> > 
> > Robert Wilton <rwilton@cisco.com> wrote:
> >> 
> >> 
> >> On 23/10/2017 10:10, Martin Bjorklund wrote:
> >>> Andy Bierman <andy@yumaworks.com> wrote:
> >>>> On Fri, Oct 20, 2017 at 9:24 AM, Robert Wilton <rwilton@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 <rwilton@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:
> >>> No.  text() will select the text node children of the context node.
> >> This is presumably because text() is evaluated as "child::text()".
> > 
> > Yes.
> > 
> >>>>   /foo/*[text() = 'fred']  // wrong!
> >>> This actually works.  text() selects all text nodes (just one for a
> >>> leaf), and then that text node is compared to the string 'fred'.
> >> For clarity, am I right in my interpretation that a leaf is not itself
> >> a text node, but instead a leaf is an element node that contains a
> >> direct child text node?
> > 
> > Yes.
> 
> In principle, there could be multiple text nodes

Do you mean for a YANG leaf?


/martin

> (in XML processing
> this is quite common).
> 
> Lada
> 
> > 
> >> Presumably, it is only leaf and leaf-list element nodes that can have
> >> these direct child text nodes.
> > 
> > Yes.
> > 
> >> I can see how this make sense for a XML document, but it does feel a
> >> bit non intuitive for a YANG data tree
> > 
> > Maybe, but since we use XPath, we need to conform to the data model
> > used by XPath (see section 5 of the xpath spec).
> > 
> >> and it may be helpful if this
> >> is documented somewhat ...
> > 
> > RFC 7950 refers to the data model of XPath (See section 6.4 of RFC
> > 7950), but I agree that it could have had more text.  Specifically, it
> > could have stated how nodes are mapped to elements, that only
> > leaf/leaf-list have text nodes; that annotations are mapped to
> > attribute nodes (ok, not really in 7950...); that there are no
> > processing-instruction and comment nodes.
> > 
> >> 
> >>  /foo/*[. = 'fred']  // correct
> >> 
> >> Presumably this test isn't quite the same, since child container and
> >> list nodes would also be included in the comparison (i.e. by
> >> concatenating all their descendant leaf values together into a single
> >> string)
> >> whereas the expression with the text() check will only
> >> include the values of direct child leaf and leaf-list nodes (as YANG
> >> is currently defined today).
> > 
> > Yes.
> > 
> > 
> > /martin
> > 
> > _______________________________________________
> > netmod mailing list
> > netmod@ietf.org
> > https://www.ietf.org/mailman/listinfo/netmod
> 
> --
> Ladislav Lhotka
> Head, CZ.NIC Labs
> PGP Key ID: 0xB8F92B08A9F76C67
> 
> 
> 
> 
>