XSLT for Converting HTML to JSON

Transforming meta Elements, a top header (h1) and children paragraphs in main

(File html-to-json.meta-and-paragraphs-in-main.xsl)

Here is some sample code for converting from HTML to JSON.

First, we transform a simple page with some meta elements in its head element, and a /html/body/main element holding a header (h1) and some paragraphs:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.1"
                exclude-result-prefixes="html">

<xsl:output method="html"
            encoding="UTF-8"
            media-type="text/plain"
            indent="yes"/>

<!-- strip whitespace from whitespace-only nodes -->
<xsl:strip-space elements="*"/>

<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>

<!-- handle element nodes -->
<xsl:template match="html">
{
  "title": "<xsl:value-of select="head/title"/>"<xsl:if test="head/meta[@name='keywords']">,
  "keywords": "<xsl:value-of select="head/meta[@name='keywords']/@content"/>"</xsl:if><xsl:if test="head/meta[@name='author']">,
  "author": "<xsl:value-of select="head/meta[@name='author']/@content"/>"</xsl:if><xsl:if test="head/meta[@name='description']">,
  "description": "<xsl:value-of select="head/meta[@name='description']/@content"/>"
  </xsl:if><xsl:if test="body//h1">,
  "h1": "<xsl:value-of select="body//h1[1]"/>"</xsl:if><xsl:if test="body/main">,
  "main" : [
    <xsl:for-each select="body/main/p">"<xsl:value-of select="."/>"<xsl:if test="position() < last()">,
    </xsl:if></xsl:for-each>
  ]
  </xsl:if>
}
</xsl:template>

</xsl:stylesheet>

Rewrite Sections (section) as Objects of an Array

[...]