| Subject: [xsl] constructing arrays in XSLT with templates From: "Alan Painter alan.painter@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Fri, 18 Jun 2021 18:40:09 -0000 | 
Hi fellow XSLT enthusiasts,
I've been constructing json in XSLT using xsl:map and xsl:map-entry and the
resulting code looks really nice.  But I'm a bit stuck with arrays and was
hoping for some enlightenment.
Taking as input example:
<books>
  <book>
    <title>The C Programming Language</title>
    <author>Brian Kernighan</author>
    <author>Dennis Ritchie</author>
  </book>
  <book>
    <title>Principles of Compiler Design</title>
    <author>Alfred V. Aho</author>
    <author>Jeffrey D. Ullman</author>
    <author>J. E. Hopcrof</author>
  </book>
</books>
And using this stylesheet to construct a JSON representation:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="3.0">
  <xsl:mode on-no-match="fail"/>
  <xsl:output method="json" indent="yes" />
  <xsl:template match="/" >
    <xsl:map>
      <xsl:apply-templates select="books" />
    </xsl:map>
  </xsl:template>
  <xsl:template match="/books">
    <xsl:variable name="books" as="map(*)*">
      <xsl:apply-templates select="book" />
    </xsl:variable>
    <xsl:map-entry key="'books'" select="array { $books } "/>
  </xsl:template>
  <xsl:template match="book" as="map(*)">
    <xsl:map>
      <xsl:map-entry key="'title'" select="title!string()" />
      <xsl:map-entry key="'authors'" select="array { ./author!string() }
"/>
    </xsl:map>
  </xsl:template>
</xsl:stylesheet>
Within the template for "/books" I find that I have to declare a variable
in order to represent the sequence of maps that come from the nested
apply-templates.
I'd like to be able to do away with the intermediate $books variable which
is used for the purpose of constructing the array using the xpath "array {
... }" expression.
Is there a more elegant way of doing this?
thanks for any pointers and best regards
-alan
| Current Thread | 
|---|
| 
 | 
| <- Previous | Index | Next -> | 
|---|---|---|
| Re: [xsl] user-defined XSLT functio, Joel Kalvesmaki dire | Thread | Re: [xsl] constructing arrays in XS, Martin Honnen martin | 
| Re: [xsl] user-defined XSLT functio, Eliot Kimber ekimber | Date | Re: [xsl] constructing arrays in XS, Martin Honnen martin | 
| Month |