Re: XSLT 4: map serialization

"Dimitre Novatchev [email protected]" <[email protected]> Wed, 25 Nov 2020 04:56:08 -0000
Newsgroups gmane.text.xml.xsl.general.mulberrytech
Message-ID <[email protected]>
>  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 [email protected] <
[email protected]> wrote:

> On Wed, Nov 25, 2020 at 03:30:12AM -0000, Dimitre Novatchev
> [email protected] 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-Novatchev01.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  | [email protected]
> Þæs oferéode, ðisses swá mæg.
> -- Deor  ("That passed, so may this.")
> 
>
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/3329386
or by email: [email protected]
--~--