xsl-list
[Top] [All Lists]

Re: [xsl] XSLT 4: map serialization

2020-11-24 22:56:06
 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(_at_)marost(_dot_)ca <
xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com> wrote:

On Wed, Nov 25, 2020 at 03:30:12AM -0000, Dimitre Novatchev
dnovatchev(_at_)gmail(_dot_)com 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  | graydonish(_at_)gmail(_dot_)com
Þæ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/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--
<Prev in Thread] Current Thread [Next in Thread>