- From: Dimitre Novatchev <dnovatchev@gmail.com>
- Date: Sat, 9 Jan 2021 12:46:02 -0800
- To: Michael Kay <mike@saxonica.com>
- Cc: public-xslt-40@w3.org
- Message-ID: <CAK4KnZcA1DDGK=w=wz1XmxSjdTNBckMk=Pnhn0pT8pYO9UMDCw@mail.gmail.com>
On Sat, Jan 9, 2021 at 11:54 AM Michael Kay <mike@saxonica.com> wrote:
> Let's do a use case: converting
>
> <hiistory>
> <created by="Michael Kay" on="2016-12-19"/>
> <modified by="Michael Kay" on="2017-08-10" change="more precise
> result assertion"/>
> <modified by="Michael Kay" on="2019-12-02" change="Test wrongly
> assumed that document order was predictable.'"/>
> </history>
>
> to JSON:
>
> [
> { "event": "created",
> "by" : "Michael Kay",
> "on" : "2016-12-19" },
>
> {"event" : "modified:
> "by" : "Michael Kay",
> "on" : "2017-08-10",
> "change" : "more precise result assertion" },
>
> {"event" : "modified:
> "by" : "Michael Kay",
> "on" : "2019-12-02",
> "change" : "est wrongly assumed that document order was
> predictable." }
> ]
>
> I want to do this using template rules. Something like this:
>
> <xsl:output method="json"/>
>
> <xsl:template match="history">
> <xsl:array>
> <xsl:apply-templates/>
> </xsl:array>
> </xsl:template>
>
> <xsl:template match="history/*">
> <xsl:array-member>
> <xsl:map>
> <xsl:map-entry key="'event'" select="local-name()"/>
> <xsl:apply-templates select="@*"/>
> </xsl:map>
> </xsl:array-member>
> </xsl:template>
>
> <xsl:template match="@*">
> <xsl:map-entry key="local-name()" select="."/>
> </xsl:template>
>
> How would you want to write this?
>
I would prefer the proposed syntax, providing a member-generator function
as the value of the member-generator attribute:
<xsl:output method="json"/>
<xsl:template match="history">
<xsl:array member-source="*" member-generator="my:mapHistory"/>
</xsl:template>
<xsl:function name="my:mapHistory" as="item()*">
<xsl:param name="pIndex" as="xs:integer"/>
<xsl:param name="pMemberSource" as="element()"/>
<xsl:variable name="vMember" select="$pMemberSource [$pIndex]"/>
<xsl:sequence select=
"map:merge(
(map-entry('event' : $vMember/local-name(),
for $mem in $vMember/@*
return
map:entry($mem/local-name(),
$mem/string())
)
)
"/>
</xsl:function>
Thanks,
Dimitre
>
> Michael Kay
> Saxonica
>
>
>
>
--
Cheers,
Dimitre Novatchev
---------------------------------------
Truly great madness cannot be achieved without significant intelligence.
---------------------------------------
To invent, you need a good imagination and a pile of junk
-------------------------------------
Never fight an inanimate object
-------------------------------------
To avoid situations in which you might make mistakes may be the
biggest mistake of all
------------------------------------
Quality means doing it right when no one is looking.
-------------------------------------
You've achieved success in your field when you don't know whether what
you're doing is work or play
-------------------------------------
To achieve the impossible dream, try going to sleep.
-------------------------------------
Facts do not cease to exist because they are ignored.
-------------------------------------
Typing monkeys will write all Shakespeare's works in 200yrs.Will they write
all patents, too? :)
-------------------------------------
Sanity is madness put to good use.
-------------------------------------
I finally figured out the only reason to be alive is to enjoy it.
Received on Saturday, 9 January 2021 20:46:27 UTC