Subject: Re: [xsl] How to write (existential) predicates with maps/Why is there no effective boolean value for a map? From: "Dimitre Novatchev dnovatchev@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Wed, 13 Feb 2019 01:48:48 -0000 |
> When I started this I was fairly neutral about it, but I've now used Javascript enough to form a strong distaste for weak typing. What about Typescript? Cheers, Dimitre Novatchev On Tue, Feb 12, 2019 at 8:41 AM Michael Kay mike@xxxxxxxxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > > I've improved the error message so it now says: > > FORG0006: Effective boolean value is not defined for sequence starting with a map > (map{"name":"foo", }) > > The reason for the problem: > > > parse-json($json)?locations?*[?types?*[?name = 'foo']]" > > locations?* => a sequence of maps > > ?types => a sequence of arrays > > ?types?* => a sequence of maps > > So the value of the outer predicate is a sequence of zero-or-more maps, and you can't get the EBV of a map. > > Created W3C test case predicate-056. > > >What is the reason that the effective boolean value was not extended to give true for a sequence with a map? > > Sentiment in the WGs slowly moved away from weak typing and implicit conversion over the years that followed XPath 1.0 (Getting arrays to be atomizable was a bit of a battle). I think the richer the type system becomes, the more useful it is to have errors rather than implicit conversions. I saw a horrible one last week in which someone did <xsl:with-param>2</xsl:with-param> and then tried to use the value as a "numeric" predicate, not realising it was actually a node. > > When I started this I was fairly neutral about it, but I've now used Javascript enough to form a strong distaste for weak typing. > > Michael Kay > Saxonica > > > > > On 12 Feb 2019, at 16:07, Martin Honnen martin.honnen@xxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > > > > On 12.02.2019 15:40, Michael Kay mike@xxxxxxxxxxxx wrote: > >> I'm having trouble understanding/reproducing this. Can you supply a complete repro? (I.e., the source data that results in this error) > > > > > > The example JSON is e.g. > > > > { > > "locations" : [ > > { > > "id" : "i1", > > "types" : [ > > { > > "name" : "foo" > > }, > > { > > "name" : "bar" > > } > > ] > > }, > > { > > "id" : "i2", > > "types" : [ > > { > > "name" : "baz" > > } > > ] > > }, > > { > > "id" : "i3", > > "types" : [ > > { > > "name" : "foo" > > }, > > { > > "name" : "baz" > > } > > ] > > } > > ] > > } > > > > If you pass it to the parse-json function and use the result as the context item to the three XPath expressions I have posted then the first one gives that error while the other two return two maps. > > > > A complete repro in XSLT is > > > > <?xml version="1.0" encoding="UTF-8"?> > > <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > > xmlns:xs="http://www.w3.org/2001/XMLSchema" > > exclude-result-prefixes="#all" > > version="3.0"> > > > > <xsl:output method="adaptive"/> > > > > <xsl:param name="json" as="xs:string"> > > { > > "locations" : [ > > { > > "id" : "i1", > > "types" : [ > > { > > "name" : "foo" > > }, > > { > > "name" : "bar" > > } > > ] > > }, > > { > > "id" : "i2", > > "types" : [ > > { > > "name" : "baz" > > } > > ] > > }, > > { > > "id" : "i3", > > "types" : [ > > { > > "name" : "foo" > > }, > > { > > "name" : "baz" > > } > > ] > > } > > ] > > } > > </xsl:param> > > > > <xsl:template match="/" name="xsl:initial-template"> > > <xsl:sequence select="parse-json($json)?locations?*[?types?*[?name = 'foo']]"/> > > </xsl:template> > > > > </xsl:stylesheet> > > > > > > > > > >>> On 11 Feb 2019, at 12:09, Martin Honnen martin.honnen@xxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > >>> > >>> When using XPath 3.1 (e.g. in XSLT 3) on maps I have found that I have to change my coding habit a bit when writing predicates that want to check the existence of some nested map, while I hoped to be able to write e.g. > >>> > >>> ?locations?*[?types?*[?name = 'foo']] > >>> > >>> to select all (map) members of the "locations" array that have a "types" array with at least one (map) member having a property "name" with value "foo" I get an error > >>> > >>> Effective boolean value is not defined for sequence starting with an atomic value other than a boolean, number, or string > >>> > >>> > >>> So in contrast to my experience with writing predicates on XML it seems for maps I have to explicitly use the "exists" function e.g. > >>> > >>> ?locations?*[exists(?types?*[?name = 'foo'])] > >>> > >>> or a "some .. in" expression > >>> > >>> ?locations?*[some $m in ?types?* satisfies $m?name = 'foo'] > >>> > >>> > >>> Is there any more compact way to write such a check? > >>> > >>> What is the reason that the effective boolean value was not extended to give true for a sequence with a map?
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] How to write (existential, Liam R. E. Quin liam | Thread | Re: [xsl] How to write (existential, Mukul Gandhi gandhi. |
Re: [xsl] How to write (existential, Liam R. E. Quin liam | Date | Re: [xsl] How to write (existential, Mukul Gandhi gandhi. |
Month |