Pretty Sitemaps With Gatsby-Plugin-Sitemap

A map, looking pretty.

Photo by Stephen Monroe on Unsplash (Except the emojis, blame me for those.)

## Why are sitemaps by gatsby-plugin-sitemap ugly?

In short, because gatsby-plugin-sitemap only outputs raw XML. This might be okay if you don’t need to fiddle with your sitemap more than once a year or do not have a marketing team to please.

In my case, I have marketing people to please and this:

A wall of text, very hard to read.

won’t cut it.

gatsby-plugin-advanced-sitemap would’ve been perfect, but it doesn’t support multilingual sitemaps. (At least not the way I want it to.)

The workaround I found is simply to…

## Add an XSL style sheet to the sitemap generated by Gatsby

XSL is basically CSS for XML. All you need to make an XML sitemap pretty is give it a style sheet.

So, find a style sheet that suits your need and put it in the ./static/ folder at the root of your project. (I used a fantastic XSL stylesheet by Pedro Borges. Thank you, Pedro! )

Then, link to that stylesheet in the XML files generated by gatsby-plugin-sitemap. There is no out-of-the-box API to do this, but we can modify the XML files after the build has completed.

(Yes, this is the hacky part.)

// inside gatsby-node.js
const fs = require("fs");
// ...
exports.onPostBuild = () => {
  fs.readdir("./public/sitemap/", (err, files) => {
    files.forEach((file) => {
      fs.readFile(`./public/sitemap/${file}`, "utf-8", (err, data) => {
        const newValue = data.replace(
          `<?xml version="1.0" encoding="UTF-8"?>`,
          `<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="/sitemap.xsl"?>`
        fs.writeFileSync(`./public/sitemap/${file}`, newValue, "utf-8");

onPostBuild is provided by Gatsby. Since we know the sitemaps are generated in the ./public/sitemap/ folder, all we need to do is:

  • Iterate over each file in ./public/sitemap/
  • Add <?xml-stylesheet type="text/xsl" href="/sitemap.xsl"?> to those files. (Assuming your style sheet is at ./static/sitemap.xsl)
  • Profit.

<?xml version="1.0" encoding="UTF-8"?> is unlikely to change so I feel like this strategy is pretty solid even though it’s not super duper clean.

Now, look how cute my sitemap is! ❤️

A wall of text, very hard to read.

(Text has been obfuscated)

Happy hacking!


Sign up to my newsletter and get a free PDF about how to get people to sign up for your newsletters!

Powered by EmailOctopus