Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>This is how you can do it. It is not easy and straightforward I'm afraid, though. The way your input XMl is structured makes it harder to access the relevant nodes.</p> <p>For example, in several places you need to access nodes that are naturally not in the context. To adress this I use variables and parameters.</p> <p>But it is quite generic, i.e. you can process an arbitrary number of <code>DATASETS</code>, <code>Regions</code> or <code>Districts</code>. It creates an HTML table to display the counts.</p> <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt; &lt;xsl:output method="xml" indent="yes"/&gt; &lt;xsl:template match="/"&gt; &lt;xsl:element name="html"&gt; &lt;xsl:apply-templates/&gt; &lt;/xsl:element&gt; &lt;/xsl:template&gt; &lt;xsl:template match="DATASETLIST"&gt; &lt;xsl:element name="head"&gt; &lt;xsl:element name="title"&gt; &lt;xsl:text&gt;DATASET counts&lt;/xsl:text&gt; &lt;/xsl:element&gt; &lt;/xsl:element&gt; &lt;xsl:element name="body"&gt; &lt;xsl:element name="table"&gt; &lt;xsl:attribute name="border"&gt;1&lt;/xsl:attribute&gt; &lt;xsl:call-template name="tbl"/&gt; &lt;/xsl:element&gt; &lt;/xsl:element&gt; &lt;/xsl:template&gt; &lt;xsl:template name="tbl"&gt; &lt;xsl:param name="regions" select="distinct-values(DATASET/ROW/Region)"/&gt; &lt;xsl:param name="rows" select="DATASET/ROW"/&gt; &lt;xsl:param name="datasets" select="DATASET"/&gt; &lt;!--header row--&gt; &lt;xsl:element name="tr"&gt; &lt;xsl:element name="th"/&gt; &lt;xsl:for-each select="$datasets"&gt; &lt;xsl:element name="th"&gt; &lt;xsl:value-of select="@entity"/&gt; &lt;/xsl:element&gt; &lt;/xsl:for-each&gt; &lt;/xsl:element&gt; &lt;!--Totals row--&gt; &lt;xsl:element name="tr"&gt; &lt;xsl:element name="td"&gt; &lt;xsl:element name="b"&gt; &lt;xsl:text&gt;Total&lt;/xsl:text&gt; &lt;/xsl:element&gt; &lt;/xsl:element&gt; &lt;xsl:for-each select="$datasets"&gt; &lt;xsl:element name="td"&gt; &lt;xsl:value-of select="count(ROW)"/&gt; &lt;/xsl:element&gt; &lt;/xsl:for-each&gt; &lt;/xsl:element&gt; &lt;xsl:element name="tr"/&gt; &lt;!--region rows--&gt; &lt;xsl:for-each select="$regions"&gt; &lt;xsl:variable name="region" select="."/&gt; &lt;xsl:element name="tr"&gt; &lt;xsl:element name="td"&gt; &lt;xsl:element name="b"&gt; &lt;xsl:value-of select="."/&gt; &lt;/xsl:element&gt; &lt;/xsl:element&gt; &lt;xsl:for-each select="$datasets"&gt; &lt;xsl:element name="td"&gt; &lt;xsl:value-of select="count(ROW/Region[.=$region])"/&gt; &lt;/xsl:element&gt; &lt;/xsl:for-each&gt; &lt;/xsl:element&gt; &lt;!--district rows--&gt; &lt;xsl:for-each select="distinct-values($rows[Region=$region]/District)"&gt; &lt;xsl:variable name="district" select="."/&gt; &lt;xsl:element name="tr"&gt; &lt;xsl:element name="td"&gt; &lt;xsl:value-of select="."/&gt; &lt;/xsl:element&gt; &lt;xsl:for-each select="$datasets"&gt; &lt;xsl:element name="td"&gt; &lt;xsl:value-of select="count(ROW/District[.=$district])"/&gt; &lt;/xsl:element&gt; &lt;/xsl:for-each&gt; &lt;/xsl:element&gt; &lt;/xsl:for-each&gt; &lt;xsl:element name="tr"/&gt; &lt;/xsl:for-each&gt; &lt;/xsl:template&gt; &lt;/xsl:stylesheet&gt; </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload