Dynamically publishing a list with the most recent topics
13 Jan 2022
Read time: 8 minute(s)
DITA topics can contain an optional <created>
element that specifies
the date when they were created by the technical writer.
<topic id="..."> <title>...</title> <prolog> <author>...</author> <critdates> <created date="2022-01-13"/> </critdates>
At the time of publishing, we can dynamically generate a topic that contains a list of the most recent topics, while taking the creation date into account for each topic by customizing the WebHelp Responsive output.
DITA WebHelp output can be customized using a publishing template mechanism. Inside a
publishing template folder, there is an opt file that can contain
links to various XSLT stylesheets that are useful for customizations. For example, we'll
add a link to a stylesheet for processing such special keyword label
elements:
<publishing-template> <name>.....</name> ...... <xslt> .... <extension file="xslt/updateWhatsNew.xsl" id="com.oxygenxml.webhelp.xsl.createTocXML"/> ..... </xslt> </webhelp> </publishing-template>The updateWhatsNew.xsl stylesheet will sort the first five most recent topics and create a new DITA topic that contains it:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0" xmlns:toc="http://www.oxygenxml.com/ns/webhelp/toc"> <!-- Artifically impose content to the what's new topic. --> <xsl:template match="/"> <xsl:next-match/> <xsl:result-document href="{resolve-uri('topics/what_s_new.dita', base-uri())}"> <xsl:processing-instruction name="workdir-uri"><xsl:value-of select="replace(resolve-uri('topics/what_s_new.dita', base-uri()), 'what_s_new.dita', '')"/></xsl:processing-instruction> <xsl:processing-instruction name="path2project-uri">../</xsl:processing-instruction> <xsl:processing-instruction name="path2rootmap-uri">../</xsl:processing-instruction> <topic xmlns:ditaarch="http://dita.oasis-open.org/architecture/2005/" id="topic_v5l_lts_fsb" ditaarch:DITAArchVersion="1.3" domains="(topic abbrev-d) a(props deliveryTarget) (topic equation-d) (topic hazard-d) (topic hi-d) (topic indexing-d) (topic markup-d) (topic mathml-d) (topic pr-d) (topic relmgmt-d) (topic sw-d) (topic svg-d) (topic ui-d) (topic ut-d) (topic markup-d xml-d) " class="- topic/topic "> <title class="- topic/title ">What's New!</title> <body class="- topic/body "> <p class="- topic/p ">Most recent blog posts:</p> <section class="- topic/section "> <!-- Find the most recent topics by looking at the creation date and sorting them descending --> <xsl:for-each select="//topicref[@href][not(@format) or @format = 'dita'][doc-available(resolve-uri(@href, base-uri()))][document(resolve-uri(@href, base-uri()))/*/prolog/critdates/created/@date]"> <xsl:sort select="document(resolve-uri(@href, base-uri()))/*/prolog/critdates/created/@date" order="descending"/> <!-- Present only the first 5 topics --> <xsl:if test="position() < 6"> <xsl:variable name="doc" select="document(resolve-uri(@href, base-uri()))"/> <p class="- topic/p "> <xref href="{replace(@href, 'topics/', '')}" class="- topic/xref "><xsl:value-of select="$doc/*/title"/></xref> </p> </xsl:if> </xsl:for-each> </section> </body> </topic> </xsl:result-document> </xsl:template> </xsl:stylesheet>
In the DITA Map, we need to add a reference to a stub DITA topic that will be overwritten
by the publishing
process:
<topicref href="topics/what_s_new.dita" print="no"/>
The published output will produce a what's new topic as the one here: what_s_new.html.
The WebHelp publishing template used for publishing this blog already has a customization to display a recent list of topics: https://github.com/oxygenxml/blog/tree/master/publishing/webhelpBlogTemplate.