Re: [xsl] XSLT 4: map serialization

Subject: Re: [xsl] XSLT 4: map serialization
From: "Dimitre Novatchev dnovatchev@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 25 Nov 2020 04:56:00 -0000
>  works, but while this is doubtless a question of aesthetic bias I don't
consider this solution more elegant than (or preferable to) the XSLT version

The problem stated in the initial post was that:

"This isn't allowed, because map:for-each() takes an XPath function, rather
than an XQuery function, so it hasn't got access to element constructors"

*The pure XPath solution is also an XQuery solution*, as XQuery is a
superset of XPath.

*As for elegance*, one can write a more elegant expression if one defines a
separate inline XPath function:

*let $makeElement := function($k, $v) {*
*  parse-xml('<' || $k '>' || $v '</' || $k '>' )*
* return*
*    ($wordArchive ! $ makeElement('entry', map:for-each(., $makeElement
($k, $x)))*
*       ! parse-xml(.)*
*}*

Not tested, as I am not acquainted with the detailed specific problem, but
a working solution would look similar and this is elegant and easy to read
and understand.

Not to mention that having a comprehensive library of XPath functions is
both powerful and elegant as it provides a set of basic building blocks for
potentially unlimited number and scope of problems.


HTH,
Dimitre

On Tue, Nov 24, 2020 at 8:03 PM Graydon graydon@xxxxxxxxx <
xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:

> On Wed, Nov 25, 2020 at 03:30:12AM -0000, Dimitre Novatchev
> dnovatchev@xxxxxxxxx scripsit:
> > > So if I have a sequence of maps, such as one gets from using
> > > collection() with the metadata flag set in Saxon, and I want to
> > > serialize the result just to see what is in there, I'd like to be
> > > able to use:
> >
> > Demonstrated how to do this in pure XPath  7 years ago at the Balisage
> > 2013 conference:
> >
> >
>
https://www.balisage.net/Proceedings/vol10/print/Novatchev01/BalisageVol10-No
vatchev01.html#d240124e851
>
> <xsl:sequence select="
>   $wordArchive !
>   ('&lt;entry>' || (map:for-each(., function ($k, $x) {
>     if ($k eq 'fetch') then
>       ''
>     else
>       concat('&lt;', $k, '>') || $x || concat('&lt;/', $k, '>')
>   })) => string-join('') || '&lt;/entry>') ! parse-xml(.)" />
>
> works, but while this is doubtless a question of aesthetic bias I don't
> consider this solution more elegant than (or preferable to) the XSLT
> version.
>
> --
> Graydon Saunders  | graydonish@xxxxxxxxx
> CC&s oferC)ode, C0isses swC! mC&g.
> -- Deor  ("That passed, so may this.")

Current Thread