On Wed, Aug 8, 2018 at 6:50 AM, Martin Bjorklund <[email protected]> wrote:

> Hi,
>
> "Sterne, Jason (Nokia - CA/Ottawa)" <[email protected]> wrote:
> > Thanks William.
> > Please see below.
> > Regards,
> > Jason
> >
> > > -----Original Message-----
> > > From: Ivory, William <[email protected]>
> > > Sent: Wednesday, August 8, 2018 3:27 AM
> > > To: Sterne, Jason (Nokia - CA/Ottawa) <[email protected]>;
> > > [email protected]
> > > Subject: Re: [netmod] false() vs 'false' in 'when' statements
> > >
> > > On 07/08/18 18:37, Sterne, Jason (Nokia - CA/Ottawa) wrote:
> > > Hi all,
> > >
> > > When comparing the value of a boolean leaf in a 'when' statement (or a
> > > 'must'
> > > statement), is an equality comparison to 'true' or 'false' the same as
> > > a check
> > > against true() or false() ?
> > >
> > > For example:
> > >
> > > leaf a {
> > >     type boolean;
> > > }
> > > leaf b {
> > >     type uint32;
> > >     when ".../a = 'true'";
> > > }
> > > leaf c {
> > >     type uint32;
> > >     when ".../a = 'false'";
> > > }
> > > (note that neither b nor c can be configured if leaf a isn't
> > > explicitly configured
> > > with a value since there is no default)
> > >
> > > If I replace the two 'when' statements above with the following
> > > instead, is the
> > > behavior the same ?
> > >     ...
> > >     when ".../a = true()";
> > >     ...
> > >     when ".../a = false()";
> > >     ...
> > >
> > > Or does "../a = true()" behave as an existence check on leaf a and
> > > would be
> > > enabled whether a is configured as true or false ?
> > >
> > > Regards,
> > > Jason
> > >
> > >
> > >
> > > See https://www.w3.org/TR/1999/REC-xpath-19991116/#booleans
> > >
> > > (a) "../a = 'true'"
> > >
> > > Compares 'string-value' (same as value of node if a leaf, rather more
> > > interesting if a list / container!) of each node in nodeset generated
> > > by '../a' and
> > > if any node in the nodeset matches 'true', expression is true.
> >
> > [>>JTS: ] In my specific example, leaf a is a single Boolean leaf.  In
> > that case, are these equivalent ?
> >     when ".../a = 'true'";
> >     when ".../a = true()";
>
> No...
>
> > and are these also equivalent ?
> >     when ".../a = 'false'";
> >     when ".../a = false()";
>
> .... and no.
>
> What you probably want is ".../a = 'true'" (or 'false').
>
> The expression:
>
>     ".../a = true()";
>
> will first take the string value of ".../a", which e.g. is "false".
> This string value is then converted to a boolean, resulting in the
> boolean value True (b/c the string is non-empty).
>
> This means that if "a" is set at all (to true or false), the
> expression ".../a = true()" returns true.  The expression ".../a =
> false()" will only return true if "a" is unset.
>
>

I suggest reading the XPath definition of boolean comparisons:
https://www.w3.org/TR/1999/REC-xpath-19991116/#booleans

It is a bit complicated, but generally, a node-set is converted
to a boolean (==false for empty, ==true for not empty) when
compared to a boolean for equality/inequality.

 false is a boolean
 'false' is a string
 false() is a function that return a boolean


Andy


> (sorry if I'm being dense here, but I'm not 100% positive if I'm
> > interpreting your explanations correctly and getting the right
> > conclusion.  I've never seen must or when statements that use =
> > false() or = true()).
> >
> > [>>JTS: ] Are the strings 'true' and 'false' the "string-value" (that
> > you mention above) for a Boolean leaf ?
>
> Yes, according to 9.5.1 in RFC 7950.
>
> > 'a' is a single Boolean leaf so the nodeset is that single leaf and
> > the value is 'true' or 'false'.
> >
> > >
> > > (b) "../a = true()"
> > >
> > > Similar to above but after getting the string-value, this is converted
> > > to a
> > > boolean before comparing with the boolean true.
> >
> > [>>JTS: ] I'm a bit confused here.  Are you saying that the
> > string-value of leaf a is converted to a Boolean ?
> > Do the string-values of a convert to something that is equal to true()
> > or false() ?
>
> See above.
>
>
> /martin
>
>
> >
> > >
> > > (c) '../a'
> > >
> > > True if the nodeset generated by this expression is not empty.
> > >
> > > ---
> > >
> > > Caveats alluded to above are that if '../a' matches multiple nodes,
> > > then only
> > > one of these nodes needs to pass the test for the test to be true.
> > > Separately, if
> > > any of the nodes are not leaves, the 'string-value' is a concatenated
> > > string of
> > > the values of the node's child / grandchild leaves.
> > >
> > > Hope that helps.  You wouldn't believe the number of unit tests I have
> > > to make
> > > sure we get this logic right!  Using '!=' when comparing a nodeset
> > > with >1 node
> > > with other values is very likely not to give the answer you expect (-:
> > >
> > > Regards,
> > >
> > > William
> > >
> >
> > _______________________________________________
> > netmod mailing list
> > [email protected]
> > https://www.ietf.org/mailman/listinfo/netmod
> >
>
> _______________________________________________
> netmod mailing list
> [email protected]
> https://www.ietf.org/mailman/listinfo/netmod
>
_______________________________________________
netmod mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/netmod

Reply via email to