Skip to content

Instantly share code, notes, and snippets.

@spiralx
Created September 29, 2021 12:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save spiralx/dcb7e5fa4e5dedd800e292848ed22aa9 to your computer and use it in GitHub Desktop.
Save spiralx/dcb7e5fa4e5dedd800e292848ed22aa9 to your computer and use it in GitHub Desktop.
XSLT stylesheet to transform HTML into its own formatted and highlighted source code
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="html.xsl"?>
<!DOCTYPE stylesheet [
<!ENTITY nbsp "&#160;">
<!ENTITY QUOTE "<xsl:text>&quot;</xsl:text>">
]><xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xdoc="http://spiralx.org/2010/XMLDoc"
xmlns="http://www.w3.org/1999/xhtml"
version="2.0">
<!--
Stylesheet for generating an HTML 5 page with a pretty-printed version of
the source document's XML.
-->
<xsl:output method="html" encoding="UTF-8" indent="yes" />
<xsl:decimal-format decimal-separator="." grouping-separator="," />
<xsl:preserve-space elements="style script textarea" />
<!--
Title of document, looks for an element in the source annotated with
xdoc:title="true" first, otherwise uses the name of the root element.
-->
<xsl:variable name="title">
<xsl:choose>
<xsl:when test="//*[@xdoc:title = 'true']">
<xsl:value-of select="normalize-space(//*[@xdoc:title = 'true'])" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="name(/*)" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="xdoc-test" xdoc:title="false">Testing xdoc:title attribute!</xsl:variable>
<!-- Root template, generates HTML output skeleton -->
<xsl:template match="/">
<html lang="en">
<head>
<meta charset="UTF-8" />
<title><xsl:value-of select="$title" /></title>
<link rel="stylesheet/less" href="xml-html.less" />
<script src="https://unpkg.com/less" defer="true"></script>
</head>
<body>
<xsl:apply-templates />
<!--<xsl:call-template name="write-debug-messages" />-->
</body>
</html>
</xsl:template>
<!-- Match source root element, write title and global div -->
<xsl:template match="/*">
<h1><xsl:value-of select="$title" /></h1>
<div id="content" class="xml-tree">
<xsl:apply-templates select="." mode="generate" />
</div>
</xsl:template>
<!-- Element node, call generate template and wrap in an <li> tag -->
<xsl:template match="*|comment()">
<li>
<xsl:apply-templates select="." mode="generate" />
</li>
</xsl:template>
<!-- Turn an element in the source into formatted HTML -->
<xsl:template match="*" mode="generate">
<div class="element">
<xsl:attribute name="child-count">
<xsl:value-of select="count(child::*)" />
</xsl:attribute>
<xsl:attribute name="text-count">
<xsl:value-of select="count(child::text())" />
</xsl:attribute>
<xsl:choose>
<!-- Empty element -->
<xsl:when test="count(child::node()) = 0">
<xsl:apply-templates select="." mode="tag.closed" />
</xsl:when>
<!-- No attributes or child elements, just text -->
<xsl:when test="count(child::*) = 0 and count(child::text())">
<xsl:apply-templates select="." mode="tag.start" />
<span class="text">
<xsl:copy-of select="text()" />
</span>
<xsl:apply-templates select="." mode="tag.end" />
</xsl:when>
<!-- Has a combination of child elements, text and attributes -->
<xsl:otherwise>
<xsl:apply-templates select="." mode="tag.start" />
<ul>
<xsl:apply-templates mode="generate" />
</ul>
<xsl:apply-templates select="." mode="tag.end" />
</xsl:otherwise>
</xsl:choose>
</div>
</xsl:template>
<!-- Write start tag with any attributes -->
<xsl:template match="*" mode="tag.start">
<div class="tag start-tag">
<span class="punc">&lt;</span>
<span class="name">
<xsl:value-of select="name()" />
</span>
<xsl:apply-templates select="." mode="tag.attrs" />
<span class="punc">&gt;</span>
</div>
</xsl:template>
<!-- Self-closed tag -->
<xsl:template match="*" mode="tag.closed">
<div class="tag closed-tag start-tag">
<span class="punc">&lt;</span>
<span class="name">
<xsl:value-of select="name()" />
</span>
<xsl:apply-templates select="." mode="tag.attrs" />
<xsl:text>&nbsp;</xsl:text>
<span class="punc">/&gt;</span>
</div>
</xsl:template>
<!-- Write end tag -->
<xsl:template match="*" mode="tag.end">
<div class="tag end-tag">
<span class="punc">&lt;/</span>
<span class="name">
<xsl:value-of select="name()" />
</span>
<span class="punc">&gt;</span>
</div>
</xsl:template>
<!-- Writes list of attributes -->
<xsl:template match="*" mode="tag.attrs">
<xsl:for-each select="@*">
<xsl:text> </xsl:text>
<xsl:apply-templates select="." mode="generate" />
</xsl:for-each>
</xsl:template>
<!-- Format attribute node as name="value" -->
<xsl:template match="@*" mode="generate">
<span class="attribute">
<!--<span class="punc at">@</span>-->
<span class="name">
<xsl:value-of select="name()" />
</span>
<span class="punc eq">="</span>
<span class="value">
<xsl:value-of select="string()" />
</span>
<span class="punc">"</span>
</span>
</xsl:template>
<!-- Format comment -->
<xsl:template match="comment()" mode="generate">
<div class="comment">
<xsl:text>&lt;--</xsl:text>
<xsl:value-of select="string(.)" />
<xsl:text>--&gt;</xsl:text>
</div>
</xsl:template>
<!-- Format text -->
<xsl:template match="text()" mode="generate">
<xsl:if test="normalize-space(.)">
<div class="text">
<xsl:copy />
<!--<xsl:value-of select="replace(., '&amp;lt;', '&amp;amp;lt;')" />-->
</div>
</xsl:if>
</xsl:template>
<!-- Debugging output -->
<xsl:template name="write-debug-messages">
<dl id="debug-messages">
<xsl:apply-templates select="node()|@*" mode="debug" />
</dl>
</xsl:template>
<xsl:template match="@*" mode="debug">
<dt>attribute</dt>
<dd>
<xsl:text>@</xsl:text>
<xsl:value-of select="name(.)" />
<xsl:text>=</xsl:text>
<xsl:value-of select="normalize-space()" />
</dd>
</xsl:template>
<xsl:template match="*" mode="debug">
<dt>element</dt>
<dd>
<xsl:text>&lt;</xsl:text>
<xsl:value-of select="name(.)" />
<xsl:text>&gt;</xsl:text>
</dd>
<xsl:apply-templates select="node()|@*" mode="debug" />
</xsl:template>
<xsl:template match="comment()" mode="debug">
<dt>comment</dt>
<dd><xsl:value-of select="normalize-space(.)" /></dd>
</xsl:template>
<xsl:template match="text()" mode="debug">
<xsl:if test="normalize-space(.)">
<dt>text</dt>
<dd><xsl:value-of select="normalize-space(.)" /></dd>
</xsl:if>
</xsl:template>
<xsl:template match="processing-instruction()" mode="debug">
<dt>processing-instruction</dt>
<dd><xsl:value-of select="name(.)" />, <xsl:value-of select="string(.)" /></dd>
</xsl:template>
</xsl:stylesheet>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xdoc="http://spiralx.org/2010/XMLDoc" lang="en">
<head>
<meta charset="UTF-8"></meta>
<title>xsl:stylesheet</title>
<link rel="stylesheet/less" href="xml-html.less"></link><script src="https://unpkg.com/less" defer="true"></script></head>
<body>
<h1>xsl:stylesheet</h1>
<div id="content" class="xml-tree">
<div class="element" child-count="22" text-count="37">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:stylesheet</span> <span class="attribute"><span class="punc at">@</span><span class="name">version</span><span class="punc eq">="</span><span class="value">2.0</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="comment">&lt;--
Stylesheet for generating an HTML 5 page with a pretty-printed version of
the source document's XML.
--&gt;
</div>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:output</span> <span class="attribute"><span class="punc at">@</span><span class="name">method</span><span class="punc eq">="</span><span class="value">html</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">encoding</span><span class="punc eq">="</span><span class="value">UTF-8</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">indent</span><span class="punc eq">="</span><span class="value">yes</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:decimal-format</span> <span class="attribute"><span class="punc at">@</span><span class="name">decimal-separator</span><span class="punc eq">="</span><span class="value">.</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">grouping-separator</span><span class="punc eq">="</span><span class="value">,</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:preserve-space</span> <span class="attribute"><span class="punc at">@</span><span class="name">elements</span><span class="punc eq">="</span><span class="value">style script textarea</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
<div class="comment">&lt;--
Title of document, looks for an element in the source annotated with
xdoc:title="true" first, otherwise uses the name of the root element.
--&gt;
</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:variable</span> <span class="attribute"><span class="punc at">@</span><span class="name">name</span><span class="punc eq">="</span><span class="value">title</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="2" text-count="3">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:choose</span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:when</span> <span class="attribute"><span class="punc at">@</span><span class="name">test</span><span class="punc eq">="</span><span class="value">//*[@xdoc:title = 'true']</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:value-of</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">normalize-space(//*[@xdoc:title = 'true'])</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:when</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:otherwise</span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:value-of</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">name(/*)</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:otherwise</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:choose</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:variable</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:variable</span> <span class="attribute"><span class="punc at">@</span><span class="name">name</span><span class="punc eq">="</span><span class="value">xdoc-test</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">xdoc:title</span><span class="punc eq">="</span><span class="value">false</span><span class="punc">"</span></span><span class="punc">&gt;</span></div><span class="text">Testing xdoc:title attribute!</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:variable</span><span class="punc">&gt;</span></div>
</div>
<div class="comment">&lt;-- Root template, generates HTML output skeleton --&gt;</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:template</span> <span class="attribute"><span class="punc at">@</span><span class="name">match</span><span class="punc eq">="</span><span class="value">/</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="2" text-count="3">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">html</span> <span class="attribute"><span class="punc at">@</span><span class="name">lang</span><span class="punc eq">="</span><span class="value">en</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="4" text-count="5">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">head</span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">meta</span> <span class="attribute"><span class="punc at">@</span><span class="name">charset</span><span class="punc eq">="</span><span class="value">UTF-8</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
<div class="element" child-count="1" text-count="0">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">title</span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:value-of</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">$title</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">title</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">link</span> <span class="attribute"><span class="punc at">@</span><span class="name">rel</span><span class="punc eq">="</span><span class="value">stylesheet/less</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">href</span><span class="punc eq">="</span><span class="value">xml-html.less</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">script</span> <span class="attribute"><span class="punc at">@</span><span class="name">src</span><span class="punc eq">="</span><span class="value">../libs/less.min.js</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">defer</span><span class="punc eq">="</span><span class="value">true</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">head</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="2" text-count="3">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">body</span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:apply-templates</span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:call-template</span> <span class="attribute"><span class="punc at">@</span><span class="name">name</span><span class="punc eq">="</span><span class="value">write-debug-messages</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">body</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">html</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:template</span><span class="punc">&gt;</span></div>
</div>
<div class="comment">&lt;-- Match source root element, write title and global div --&gt;</div>
<div class="element" child-count="2" text-count="3">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:template</span> <span class="attribute"><span class="punc at">@</span><span class="name">match</span><span class="punc eq">="</span><span class="value">/*</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="1" text-count="0">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">h1</span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:value-of</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">$title</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">h1</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">div</span> <span class="attribute"><span class="punc at">@</span><span class="name">id</span><span class="punc eq">="</span><span class="value">content</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">xml-tree</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:apply-templates</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">.</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">generate</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">div</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:template</span><span class="punc">&gt;</span></div>
</div>
<div class="comment">&lt;-- Element node, call generate template and wrap in an &lt;li&gt; tag --&gt;</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:template</span> <span class="attribute"><span class="punc at">@</span><span class="name">match</span><span class="punc eq">="</span><span class="value">*|comment()</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">li</span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:apply-templates</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">.</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">generate</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">li</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:template</span><span class="punc">&gt;</span></div>
</div>
<div class="comment">&lt;-- Turn an element in the source into formatted HTML --&gt;</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:template</span> <span class="attribute"><span class="punc at">@</span><span class="name">match</span><span class="punc eq">="</span><span class="value">*</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">generate</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="3" text-count="4">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">div</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">element</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:attribute</span> <span class="attribute"><span class="punc at">@</span><span class="name">name</span><span class="punc eq">="</span><span class="value">child-count</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:value-of</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">count(child::*)</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:attribute</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:attribute</span> <span class="attribute"><span class="punc at">@</span><span class="name">name</span><span class="punc eq">="</span><span class="value">text-count</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:value-of</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">count(child::text())</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:attribute</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="3" text-count="7">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:choose</span><span class="punc">&gt;</span></div>
<ul>
<div class="comment">&lt;-- Empty element --&gt;</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:when</span> <span class="attribute"><span class="punc at">@</span><span class="name">test</span><span class="punc eq">="</span><span class="value">count(child::node()) = 0</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:apply-templates</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">.</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">tag.closed</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:when</span><span class="punc">&gt;</span></div>
</div>
<div class="comment">&lt;-- No attributes or child elements, just text --&gt;</div>
<div class="element" child-count="3" text-count="4">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:when</span> <span class="attribute"><span class="punc at">@</span><span class="name">test</span><span class="punc eq">="</span><span class="value">count(child::*) = 0 and count(child::text())</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:apply-templates</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">.</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">tag.start</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">span</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">text</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:copy-of</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">text()</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">span</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:apply-templates</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">.</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">tag.end</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:when</span><span class="punc">&gt;</span></div>
</div>
<div class="comment">&lt;-- Has a combination of child elements, text and attributes --&gt;</div>
<div class="element" child-count="3" text-count="4">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:otherwise</span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:apply-templates</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">.</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">tag.start</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">ul</span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:apply-templates</span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">generate</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">ul</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:apply-templates</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">.</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">tag.end</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:otherwise</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:choose</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">div</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:template</span><span class="punc">&gt;</span></div>
</div>
<div class="comment">&lt;-- Write start tag with any attributes --&gt;</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:template</span> <span class="attribute"><span class="punc at">@</span><span class="name">match</span><span class="punc eq">="</span><span class="value">*</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">tag.start</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="4" text-count="5">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">div</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">tag start-tag</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">span</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">punc</span><span class="punc">"</span></span><span class="punc">&gt;</span></div><span class="text">&lt;</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">span</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">span</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">name</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:value-of</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">name()</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">span</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:apply-templates</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">.</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">tag.attrs</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">span</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">punc</span><span class="punc">"</span></span><span class="punc">&gt;</span></div><span class="text">&gt;</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">span</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">div</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:template</span><span class="punc">&gt;</span></div>
</div>
<div class="comment">&lt;-- Self-closed tag --&gt;</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:template</span> <span class="attribute"><span class="punc at">@</span><span class="name">match</span><span class="punc eq">="</span><span class="value">*</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">tag.closed</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="5" text-count="6">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">div</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">tag closed-tag start-tag</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">span</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">punc</span><span class="punc">"</span></span><span class="punc">&gt;</span></div><span class="text">&lt;</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">span</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">span</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">name</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:value-of</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">name()</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">span</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:apply-templates</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">.</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">tag.attrs</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:text</span><span class="punc">&gt;</span></div><span class="text">&nbsp;</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:text</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">span</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">punc</span><span class="punc">"</span></span><span class="punc">&gt;</span></div><span class="text">/&gt;</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">span</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">div</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:template</span><span class="punc">&gt;</span></div>
</div>
<div class="comment">&lt;-- Write end tag --&gt;</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:template</span> <span class="attribute"><span class="punc at">@</span><span class="name">match</span><span class="punc eq">="</span><span class="value">*</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">tag.end</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="3" text-count="4">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">div</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">tag end-tag</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">span</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">punc</span><span class="punc">"</span></span><span class="punc">&gt;</span></div><span class="text">&lt;/</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">span</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">span</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">name</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:value-of</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">name()</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">span</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">span</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">punc</span><span class="punc">"</span></span><span class="punc">&gt;</span></div><span class="text">&gt;</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">span</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">div</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:template</span><span class="punc">&gt;</span></div>
</div>
<div class="comment">&lt;-- Writes list of attributes --&gt;</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:template</span> <span class="attribute"><span class="punc at">@</span><span class="name">match</span><span class="punc eq">="</span><span class="value">*</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">tag.attrs</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="2" text-count="3">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:for-each</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">@*</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:text</span><span class="punc">&gt;</span></div><span class="text"> </span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:text</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:apply-templates</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">.</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">generate</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:for-each</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:template</span><span class="punc">&gt;</span></div>
</div>
<div class="comment">&lt;-- Format attribute node as name="value" --&gt;</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:template</span> <span class="attribute"><span class="punc at">@</span><span class="name">match</span><span class="punc eq">="</span><span class="value">@*</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">generate</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="5" text-count="6">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">span</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">attribute</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">span</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">punc at</span><span class="punc">"</span></span><span class="punc">&gt;</span></div><span class="text">@</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">span</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">span</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">name</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:value-of</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">name()</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">span</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">span</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">punc eq</span><span class="punc">"</span></span><span class="punc">&gt;</span></div><span class="text">="</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">span</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">span</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">value</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:value-of</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">string()</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">span</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">span</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">punc</span><span class="punc">"</span></span><span class="punc">&gt;</span></div><span class="text">"</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">span</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">span</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:template</span><span class="punc">&gt;</span></div>
</div>
<div class="comment">&lt;-- Format comment --&gt;</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:template</span> <span class="attribute"><span class="punc at">@</span><span class="name">match</span><span class="punc eq">="</span><span class="value">comment()</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">generate</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="3" text-count="4">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">div</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">comment</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:text</span><span class="punc">&gt;</span></div><span class="text">&lt;--</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:text</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:value-of</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">string(.)</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:text</span><span class="punc">&gt;</span></div><span class="text">--&gt;</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:text</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">div</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:template</span><span class="punc">&gt;</span></div>
</div>
<div class="comment">&lt;-- Format text --&gt;</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:template</span> <span class="attribute"><span class="punc at">@</span><span class="name">match</span><span class="punc eq">="</span><span class="value">text()</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">generate</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:if</span> <span class="attribute"><span class="punc at">@</span><span class="name">test</span><span class="punc eq">="</span><span class="value">normalize-space(.)</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="1" text-count="3">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">div</span> <span class="attribute"><span class="punc at">@</span><span class="name">class</span><span class="punc eq">="</span><span class="value">text</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:copy</span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
<div class="comment">&lt;--&lt;xsl:value-of select="replace(., '&amp;amp;lt;', '&amp;amp;amp;lt;')" /&gt;--&gt;</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">div</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:if</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:template</span><span class="punc">&gt;</span></div>
</div>
<div class="comment">&lt;-- Debugging output --&gt;</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:template</span> <span class="attribute"><span class="punc at">@</span><span class="name">name</span><span class="punc eq">="</span><span class="value">write-debug-messages</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">dl</span> <span class="attribute"><span class="punc at">@</span><span class="name">id</span><span class="punc eq">="</span><span class="value">debug-messages</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:apply-templates</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">node()|@*</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">debug</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">dl</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:template</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="2" text-count="3">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:template</span> <span class="attribute"><span class="punc at">@</span><span class="name">match</span><span class="punc eq">="</span><span class="value">@*</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">debug</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">dt</span><span class="punc">&gt;</span></div><span class="text">attribute</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">dt</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="4" text-count="5">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">dd</span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:text</span><span class="punc">&gt;</span></div><span class="text">@</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:text</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:value-of</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">name(.)</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:text</span><span class="punc">&gt;</span></div><span class="text">=</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:text</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:value-of</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">normalize-space()</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">dd</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:template</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="3" text-count="4">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:template</span> <span class="attribute"><span class="punc at">@</span><span class="name">match</span><span class="punc eq">="</span><span class="value">*</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">debug</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">dt</span><span class="punc">&gt;</span></div><span class="text">element</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">dt</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="3" text-count="4">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">dd</span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:text</span><span class="punc">&gt;</span></div><span class="text">&lt;</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:text</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:value-of</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">name(.)</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:text</span><span class="punc">&gt;</span></div><span class="text">&gt;</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:text</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">dd</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:apply-templates</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">node()|@*</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">debug</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:template</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="2" text-count="3">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:template</span> <span class="attribute"><span class="punc at">@</span><span class="name">match</span><span class="punc eq">="</span><span class="value">comment()</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">debug</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">dt</span><span class="punc">&gt;</span></div><span class="text">comment</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">dt</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="1" text-count="0">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">dd</span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:value-of</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">normalize-space(.)</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">dd</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:template</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="1" text-count="2">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:template</span> <span class="attribute"><span class="punc at">@</span><span class="name">match</span><span class="punc eq">="</span><span class="value">text()</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">debug</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="2" text-count="3">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:if</span> <span class="attribute"><span class="punc at">@</span><span class="name">test</span><span class="punc eq">="</span><span class="value">normalize-space(.)</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">dt</span><span class="punc">&gt;</span></div><span class="text">text</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">dt</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="1" text-count="0">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">dd</span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:value-of</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">normalize-space(.)</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">dd</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:if</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:template</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="2" text-count="3">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:template</span> <span class="attribute"><span class="punc at">@</span><span class="name">match</span><span class="punc eq">="</span><span class="value">processing-instruction()</span><span class="punc">"</span></span> <span class="attribute"><span class="punc at">@</span><span class="name">mode</span><span class="punc eq">="</span><span class="value">debug</span><span class="punc">"</span></span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">dt</span><span class="punc">&gt;</span></div><span class="text">processing-instruction</span><div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">dt</span><span class="punc">&gt;</span></div>
</div>
<div class="element" child-count="2" text-count="1">
<div class="tag start-tag"><span class="punc">&lt;</span><span class="name">dd</span><span class="punc">&gt;</span></div>
<ul>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:value-of</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">name(.)</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
<div class="text">, </div>
<div class="element" child-count="0" text-count="0">
<div class="tag closed-tag start-tag"><span class="punc">&lt;</span><span class="name">xsl:value-of</span> <span class="attribute"><span class="punc at">@</span><span class="name">select</span><span class="punc eq">="</span><span class="value">string(.)</span><span class="punc">"</span></span>&nbsp;<span class="punc">/&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">dd</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:template</span><span class="punc">&gt;</span></div>
</div>
</ul>
<div class="tag end-tag"><span class="punc">&lt;/</span><span class="name">xsl:stylesheet</span><span class="punc">&gt;</span></div>
</div>
</div>
<dl id="debug-messages">
<dt>processing-instruction</dt>
<dd>xml-stylesheet, type="text/xsl" href="html.xsl"</dd>
<dt>element</dt>
<dd>&lt;xsl:stylesheet&gt;</dd>
<dt>attribute</dt>
<dd>@version=2.0</dd>
<dt>comment</dt>
<dd>Stylesheet for generating an HTML 5 page with a pretty-printed version of the source document's XML. Remote version is at:
http://dl.dropbox.com/u/222841/xsl/html.xsl
</dd>
<dt>element</dt>
<dd>&lt;xsl:output&gt;</dd>
<dt>attribute</dt>
<dd>@method=html</dd>
<dt>attribute</dt>
<dd>@encoding=UTF-8</dd>
<dt>attribute</dt>
<dd>@indent=yes</dd>
<dt>element</dt>
<dd>&lt;xsl:decimal-format&gt;</dd>
<dt>attribute</dt>
<dd>@decimal-separator=.</dd>
<dt>attribute</dt>
<dd>@grouping-separator=,</dd>
<dt>element</dt>
<dd>&lt;xsl:preserve-space&gt;</dd>
<dt>attribute</dt>
<dd>@elements=style script textarea</dd>
<dt>comment</dt>
<dd>Title of document, looks for an element in the source annotated with xdoc:title="true" first, otherwise uses the name of the
root element.
</dd>
<dt>element</dt>
<dd>&lt;xsl:variable&gt;</dd>
<dt>attribute</dt>
<dd>@name=title</dd>
<dt>element</dt>
<dd>&lt;xsl:choose&gt;</dd>
<dt>element</dt>
<dd>&lt;xsl:when&gt;</dd>
<dt>attribute</dt>
<dd>@test=//*[@xdoc:title = 'true']</dd>
<dt>element</dt>
<dd>&lt;xsl:value-of&gt;</dd>
<dt>attribute</dt>
<dd>@select=normalize-space(//*[@xdoc:title = 'true'])</dd>
<dt>element</dt>
<dd>&lt;xsl:otherwise&gt;</dd>
<dt>element</dt>
<dd>&lt;xsl:value-of&gt;</dd>
<dt>attribute</dt>
<dd>@select=name(/*)</dd>
<dt>element</dt>
<dd>&lt;xsl:variable&gt;</dd>
<dt>attribute</dt>
<dd>@name=xdoc-test</dd>
<dt>attribute</dt>
<dd>@xdoc:title=false</dd>
<dt>text</dt>
<dd>Testing xdoc:title attribute!</dd>
<dt>comment</dt>
<dd>Root template, generates HTML output skeleton</dd>
<dt>element</dt>
<dd>&lt;xsl:template&gt;</dd>
<dt>attribute</dt>
<dd>@match=/</dd>
<dt>element</dt>
<dd>&lt;html&gt;</dd>
<dt>attribute</dt>
<dd>@lang=en</dd>
<dt>element</dt>
<dd>&lt;head&gt;</dd>
<dt>element</dt>
<dd>&lt;meta&gt;</dd>
<dt>attribute</dt>
<dd>@charset=UTF-8</dd>
<dt>element</dt>
<dd>&lt;title&gt;</dd>
<dt>element</dt>
<dd>&lt;xsl:value-of&gt;</dd>
<dt>attribute</dt>
<dd>@select=$title</dd>
<dt>element</dt>
<dd>&lt;link&gt;</dd>
<dt>attribute</dt>
<dd>@rel=stylesheet/less</dd>
<dt>attribute</dt>
<dd>@href=xml-html.less</dd>
<dt>element</dt>
<dd>&lt;script&gt;</dd>
<dt>attribute</dt>
<dd>@src=../libs/less.min.js</dd>
<dt>attribute</dt>
<dd>@defer=true</dd>
<dt>element</dt>
<dd>&lt;body&gt;</dd>
<dt>element</dt>
<dd>&lt;xsl:apply-templates&gt;</dd>
<dt>element</dt>
<dd>&lt;xsl:call-template&gt;</dd>
<dt>attribute</dt>
<dd>@name=write-debug-messages</dd>
<dt>comment</dt>
<dd>Match source root element, write title and global div</dd>
<dt>element</dt>
<dd>&lt;xsl:template&gt;</dd>
<dt>attribute</dt>
<dd>@match=/*</dd>
<dt>element</dt>
<dd>&lt;h1&gt;</dd>
<dt>element</dt>
<dd>&lt;xsl:value-of&gt;</dd>
<dt>attribute</dt>
<dd>@select=$title</dd>
<dt>element</dt>
<dd>&lt;div&gt;</dd>
<dt>attribute</dt>
<dd>@id=content</dd>
<dt>attribute</dt>
<dd>@class=xml-tree</dd>
<dt>element</dt>
<dd>&lt;xsl:apply-templates&gt;</dd>
<dt>attribute</dt>
<dd>@select=.</dd>
<dt>attribute</dt>
<dd>@mode=generate</dd>
<dt>comment</dt>
<dd>Element node, call generate template and wrap in an &lt;li&gt; tag</dd>
<dt>element</dt>
<dd>&lt;xsl:template&gt;</dd>
<dt>attribute</dt>
<dd>@match=*|comment()</dd>
<dt>element</dt>
<dd>&lt;li&gt;</dd>
<dt>element</dt>
<dd>&lt;xsl:apply-templates&gt;</dd>
<dt>attribute</dt>
<dd>@select=.</dd>
<dt>attribute</dt>
<dd>@mode=generate</dd>
<dt>comment</dt>
<dd>Turn an element in the source into formatted HTML</dd>
<dt>element</dt>
<dd>&lt;xsl:template&gt;</dd>
<dt>attribute</dt>
<dd>@match=*</dd>
<dt>attribute</dt>
<dd>@mode=generate</dd>
<dt>element</dt>
<dd>&lt;div&gt;</dd>
<dt>attribute</dt>
<dd>@class=element</dd>
<dt>element</dt>
<dd>&lt;xsl:attribute&gt;</dd>
<dt>attribute</dt>
<dd>@name=child-count</dd>
<dt>element</dt>
<dd>&lt;xsl:value-of&gt;</dd>
<dt>attribute</dt>
<dd>@select=count(child::*)</dd>
<dt>element</dt>
<dd>&lt;xsl:attribute&gt;</dd>
<dt>attribute</dt>
<dd>@name=text-count</dd>
<dt>element</dt>
<dd>&lt;xsl:value-of&gt;</dd>
<dt>attribute</dt>
<dd>@select=count(child::text())</dd>
<dt>element</dt>
<dd>&lt;xsl:choose&gt;</dd>
<dt>comment</dt>
<dd>Empty element</dd>
<dt>element</dt>
<dd>&lt;xsl:when&gt;</dd>
<dt>attribute</dt>
<dd>@test=count(child::node()) = 0</dd>
<dt>element</dt>
<dd>&lt;xsl:apply-templates&gt;</dd>
<dt>attribute</dt>
<dd>@select=.</dd>
<dt>attribute</dt>
<dd>@mode=tag.closed</dd>
<dt>comment</dt>
<dd>No attributes or child elements, just text</dd>
<dt>element</dt>
<dd>&lt;xsl:when&gt;</dd>
<dt>attribute</dt>
<dd>@test=count(child::*) = 0 and count(child::text())</dd>
<dt>element</dt>
<dd>&lt;xsl:apply-templates&gt;</dd>
<dt>attribute</dt>
<dd>@select=.</dd>
<dt>attribute</dt>
<dd>@mode=tag.start</dd>
<dt>element</dt>
<dd>&lt;span&gt;</dd>
<dt>attribute</dt>
<dd>@class=text</dd>
<dt>element</dt>
<dd>&lt;xsl:copy-of&gt;</dd>
<dt>attribute</dt>
<dd>@select=text()</dd>
<dt>element</dt>
<dd>&lt;xsl:apply-templates&gt;</dd>
<dt>attribute</dt>
<dd>@select=.</dd>
<dt>attribute</dt>
<dd>@mode=tag.end</dd>
<dt>comment</dt>
<dd>Has a combination of child elements, text and attributes</dd>
<dt>element</dt>
<dd>&lt;xsl:otherwise&gt;</dd>
<dt>element</dt>
<dd>&lt;xsl:apply-templates&gt;</dd>
<dt>attribute</dt>
<dd>@select=.</dd>
<dt>attribute</dt>
<dd>@mode=tag.start</dd>
<dt>element</dt>
<dd>&lt;ul&gt;</dd>
<dt>element</dt>
<dd>&lt;xsl:apply-templates&gt;</dd>
<dt>attribute</dt>
<dd>@mode=generate</dd>
<dt>element</dt>
<dd>&lt;xsl:apply-templates&gt;</dd>
<dt>attribute</dt>
<dd>@select=.</dd>
<dt>attribute</dt>
<dd>@mode=tag.end</dd>
<dt>comment</dt>
<dd>Write start tag with any attributes</dd>
<dt>element</dt>
<dd>&lt;xsl:template&gt;</dd>
<dt>attribute</dt>
<dd>@match=*</dd>
<dt>attribute</dt>
<dd>@mode=tag.start</dd>
<dt>element</dt>
<dd>&lt;div&gt;</dd>
<dt>attribute</dt>
<dd>@class=tag start-tag</dd>
<dt>element</dt>
<dd>&lt;span&gt;</dd>
<dt>attribute</dt>
<dd>@class=punc</dd>
<dt>text</dt>
<dd>&lt;</dd>
<dt>element</dt>
<dd>&lt;span&gt;</dd>
<dt>attribute</dt>
<dd>@class=name</dd>
<dt>element</dt>
<dd>&lt;xsl:value-of&gt;</dd>
<dt>attribute</dt>
<dd>@select=name()</dd>
<dt>element</dt>
<dd>&lt;xsl:apply-templates&gt;</dd>
<dt>attribute</dt>
<dd>@select=.</dd>
<dt>attribute</dt>
<dd>@mode=tag.attrs</dd>
<dt>element</dt>
<dd>&lt;span&gt;</dd>
<dt>attribute</dt>
<dd>@class=punc</dd>
<dt>text</dt>
<dd>&gt;</dd>
<dt>comment</dt>
<dd>Self-closed tag</dd>
<dt>element</dt>
<dd>&lt;xsl:template&gt;</dd>
<dt>attribute</dt>
<dd>@match=*</dd>
<dt>attribute</dt>
<dd>@mode=tag.closed</dd>
<dt>element</dt>
<dd>&lt;div&gt;</dd>
<dt>attribute</dt>
<dd>@class=tag closed-tag start-tag</dd>
<dt>element</dt>
<dd>&lt;span&gt;</dd>
<dt>attribute</dt>
<dd>@class=punc</dd>
<dt>text</dt>
<dd>&lt;</dd>
<dt>element</dt>
<dd>&lt;span&gt;</dd>
<dt>attribute</dt>
<dd>@class=name</dd>
<dt>element</dt>
<dd>&lt;xsl:value-of&gt;</dd>
<dt>attribute</dt>
<dd>@select=name()</dd>
<dt>element</dt>
<dd>&lt;xsl:apply-templates&gt;</dd>
<dt>attribute</dt>
<dd>@select=.</dd>
<dt>attribute</dt>
<dd>@mode=tag.attrs</dd>
<dt>element</dt>
<dd>&lt;xsl:text&gt;</dd>
<dt>text</dt>
<dd>&nbsp;</dd>
<dt>element</dt>
<dd>&lt;span&gt;</dd>
<dt>attribute</dt>
<dd>@class=punc</dd>
<dt>text</dt>
<dd>/&gt;</dd>
<dt>comment</dt>
<dd>Write end tag</dd>
<dt>element</dt>
<dd>&lt;xsl:template&gt;</dd>
<dt>attribute</dt>
<dd>@match=*</dd>
<dt>attribute</dt>
<dd>@mode=tag.end</dd>
<dt>element</dt>
<dd>&lt;div&gt;</dd>
<dt>attribute</dt>
<dd>@class=tag end-tag</dd>
<dt>element</dt>
<dd>&lt;span&gt;</dd>
<dt>attribute</dt>
<dd>@class=punc</dd>
<dt>text</dt>
<dd>&lt;/</dd>
<dt>element</dt>
<dd>&lt;span&gt;</dd>
<dt>attribute</dt>
<dd>@class=name</dd>
<dt>element</dt>
<dd>&lt;xsl:value-of&gt;</dd>
<dt>attribute</dt>
<dd>@select=name()</dd>
<dt>element</dt>
<dd>&lt;span&gt;</dd>
<dt>attribute</dt>
<dd>@class=punc</dd>
<dt>text</dt>
<dd>&gt;</dd>
<dt>comment</dt>
<dd>Writes list of attributes</dd>
<dt>element</dt>
<dd>&lt;xsl:template&gt;</dd>
<dt>attribute</dt>
<dd>@match=*</dd>
<dt>attribute</dt>
<dd>@mode=tag.attrs</dd>
<dt>element</dt>
<dd>&lt;xsl:for-each&gt;</dd>
<dt>attribute</dt>
<dd>@select=@*</dd>
<dt>element</dt>
<dd>&lt;xsl:text&gt;</dd>
<dt>element</dt>
<dd>&lt;xsl:apply-templates&gt;</dd>
<dt>attribute</dt>
<dd>@select=.</dd>
<dt>attribute</dt>
<dd>@mode=generate</dd>
<dt>comment</dt>
<dd>Format attribute node as name="value"</dd>
<dt>element</dt>
<dd>&lt;xsl:template&gt;</dd>
<dt>attribute</dt>
<dd>@match=@*</dd>
<dt>attribute</dt>
<dd>@mode=generate</dd>
<dt>element</dt>
<dd>&lt;span&gt;</dd>
<dt>attribute</dt>
<dd>@class=attribute</dd>
<dt>element</dt>
<dd>&lt;span&gt;</dd>
<dt>attribute</dt>
<dd>@class=punc at</dd>
<dt>text</dt>
<dd>@</dd>
<dt>element</dt>
<dd>&lt;span&gt;</dd>
<dt>attribute</dt>
<dd>@class=name</dd>
<dt>element</dt>
<dd>&lt;xsl:value-of&gt;</dd>
<dt>attribute</dt>
<dd>@select=name()</dd>
<dt>element</dt>
<dd>&lt;span&gt;</dd>
<dt>attribute</dt>
<dd>@class=punc eq</dd>
<dt>text</dt>
<dd>="</dd>
<dt>element</dt>
<dd>&lt;span&gt;</dd>
<dt>attribute</dt>
<dd>@class=value</dd>
<dt>element</dt>
<dd>&lt;xsl:value-of&gt;</dd>
<dt>attribute</dt>
<dd>@select=string()</dd>
<dt>element</dt>
<dd>&lt;span&gt;</dd>
<dt>attribute</dt>
<dd>@class=punc</dd>
<dt>text</dt>
<dd>"</dd>
<dt>comment</dt>
<dd>Format comment</dd>
<dt>element</dt>
<dd>&lt;xsl:template&gt;</dd>
<dt>attribute</dt>
<dd>@match=comment()</dd>
<dt>attribute</dt>
<dd>@mode=generate</dd>
<dt>element</dt>
<dd>&lt;div&gt;</dd>
<dt>attribute</dt>
<dd>@class=comment</dd>
<dt>element</dt>
<dd>&lt;xsl:text&gt;</dd>
<dt>text</dt>
<dd>&lt;--</dd>
<dt>element</dt>
<dd>&lt;xsl:value-of&gt;</dd>
<dt>attribute</dt>
<dd>@select=string(.)</dd>
<dt>element</dt>
<dd>&lt;xsl:text&gt;</dd>
<dt>text</dt>
<dd>--&gt;</dd>
<dt>comment</dt>
<dd>Format text</dd>
<dt>element</dt>
<dd>&lt;xsl:template&gt;</dd>
<dt>attribute</dt>
<dd>@match=text()</dd>
<dt>attribute</dt>
<dd>@mode=generate</dd>
<dt>element</dt>
<dd>&lt;xsl:if&gt;</dd>
<dt>attribute</dt>
<dd>@test=normalize-space(.)</dd>
<dt>element</dt>
<dd>&lt;div&gt;</dd>
<dt>attribute</dt>
<dd>@class=text</dd>
<dt>element</dt>
<dd>&lt;xsl:copy&gt;</dd>
<dt>comment</dt>
<dd>&lt;xsl:value-of select="replace(., '&amp;amp;lt;', '&amp;amp;amp;lt;')" /&gt;</dd>
<dt>comment</dt>
<dd>Debugging output</dd>
<dt>element</dt>
<dd>&lt;xsl:template&gt;</dd>
<dt>attribute</dt>
<dd>@name=write-debug-messages</dd>
<dt>element</dt>
<dd>&lt;dl&gt;</dd>
<dt>attribute</dt>
<dd>@id=debug-messages</dd>
<dt>element</dt>
<dd>&lt;xsl:apply-templates&gt;</dd>
<dt>attribute</dt>
<dd>@select=node()|@*</dd>
<dt>attribute</dt>
<dd>@mode=debug</dd>
<dt>element</dt>
<dd>&lt;xsl:template&gt;</dd>
<dt>attribute</dt>
<dd>@match=@*</dd>
<dt>attribute</dt>
<dd>@mode=debug</dd>
<dt>element</dt>
<dd>&lt;dt&gt;</dd>
<dt>text</dt>
<dd>attribute</dd>
<dt>element</dt>
<dd>&lt;dd&gt;</dd>
<dt>element</dt>
<dd>&lt;xsl:text&gt;</dd>
<dt>text</dt>
<dd>@</dd>
<dt>element</dt>
<dd>&lt;xsl:value-of&gt;</dd>
<dt>attribute</dt>
<dd>@select=name(.)</dd>
<dt>element</dt>
<dd>&lt;xsl:text&gt;</dd>
<dt>text</dt>
<dd>=</dd>
<dt>element</dt>
<dd>&lt;xsl:value-of&gt;</dd>
<dt>attribute</dt>
<dd>@select=normalize-space()</dd>
<dt>element</dt>
<dd>&lt;xsl:template&gt;</dd>
<dt>attribute</dt>
<dd>@match=*</dd>
<dt>attribute</dt>
<dd>@mode=debug</dd>
<dt>element</dt>
<dd>&lt;dt&gt;</dd>
<dt>text</dt>
<dd>element</dd>
<dt>element</dt>
<dd>&lt;dd&gt;</dd>
<dt>element</dt>
<dd>&lt;xsl:text&gt;</dd>
<dt>text</dt>
<dd>&lt;</dd>
<dt>element</dt>
<dd>&lt;xsl:value-of&gt;</dd>
<dt>attribute</dt>
<dd>@select=name(.)</dd>
<dt>element</dt>
<dd>&lt;xsl:text&gt;</dd>
<dt>text</dt>
<dd>&gt;</dd>
<dt>element</dt>
<dd>&lt;xsl:apply-templates&gt;</dd>
<dt>attribute</dt>
<dd>@select=node()|@*</dd>
<dt>attribute</dt>
<dd>@mode=debug</dd>
<dt>element</dt>
<dd>&lt;xsl:template&gt;</dd>
<dt>attribute</dt>
<dd>@match=comment()</dd>
<dt>attribute</dt>
<dd>@mode=debug</dd>
<dt>element</dt>
<dd>&lt;dt&gt;</dd>
<dt>text</dt>
<dd>comment</dd>
<dt>element</dt>
<dd>&lt;dd&gt;</dd>
<dt>element</dt>
<dd>&lt;xsl:value-of&gt;</dd>
<dt>attribute</dt>
<dd>@select=normalize-space(.)</dd>
<dt>element</dt>
<dd>&lt;xsl:template&gt;</dd>
<dt>attribute</dt>
<dd>@match=text()</dd>
<dt>attribute</dt>
<dd>@mode=debug</dd>
<dt>element</dt>
<dd>&lt;xsl:if&gt;</dd>
<dt>attribute</dt>
<dd>@test=normalize-space(.)</dd>
<dt>element</dt>
<dd>&lt;dt&gt;</dd>
<dt>text</dt>
<dd>text</dd>
<dt>element</dt>
<dd>&lt;dd&gt;</dd>
<dt>element</dt>
<dd>&lt;xsl:value-of&gt;</dd>
<dt>attribute</dt>
<dd>@select=normalize-space(.)</dd>
<dt>element</dt>
<dd>&lt;xsl:template&gt;</dd>
<dt>attribute</dt>
<dd>@match=processing-instruction()</dd>
<dt>attribute</dt>
<dd>@mode=debug</dd>
<dt>element</dt>
<dd>&lt;dt&gt;</dd>
<dt>text</dt>
<dd>processing-instruction</dd>
<dt>element</dt>
<dd>&lt;dd&gt;</dd>
<dt>element</dt>
<dd>&lt;xsl:value-of&gt;</dd>
<dt>attribute</dt>
<dd>@select=name(.)</dd>
<dt>text</dt>
<dd>,</dd>
<dt>element</dt>
<dd>&lt;xsl:value-of&gt;</dd>
<dt>attribute</dt>
<dd>@select=string(.)</dd>
</dl>
</body>
</html>
@main-background: #f8f8f8;
@main-foreground: black;
@mono-font: normal 11pt Consolas, monospace;
@element-spacing: 4px;
@text-spacing: 2px;
@eq-spacing: 2px;
.light {
@tree-colour: black;
@tree-back: white;
@punc: black;
@tag: blue;
@attr-name: #a00;
@attr-value: #4040ff;
@comment: #080;
@text: @tree-colour;
}
.dark {
@tree-back: black;
@tree-colour: white;
@punc: #80a0ff;
@tag: #80a0ff;
@attr-name: #ff8080;
@attr-value: #00ff40;
@comment: #60ff60;
@text: #eee;
}
body {
font: normal 12pt Verdana, Arial, sans-serif;
margin: 2em;
background-color: @main-background;
color: @main-foreground;
}
h1 {
font-size: 18pt;
}
div, ul, pre { margin: 0; padding: 0; }
.bold { font-weight: bold; }
.italic { font-style: italic; }
.wrap () {
text-wrap: wrap;
white-space: pre-wrap;
white-space: -moz-pre-wrap;
word-wrap: break-word;
}
.xml-tree {
.light;
display: block;
overflow: auto;
/*width: 900px;*/
margin: 1em auto;
border: solid 3px @tree-colour;
padding: 0.5em;
color: @tree-colour;
background-color: @tree-back;
font: @mono-font;
line-height: 1.5em;
white-space: nowrap;
ul {
margin-left: 1em;
list-style: none;
div.element, div.comment, div.text {
margin: @element-spacing 0;
}
}
.punc {
color: @punc;
}
.tag {
.name, .punc {
//.bold;
color: @tag;
}
.attribute {
.name, .at {
color: @attr-name;
}
.eq {
padding: 0 @eq-spacing;
}
.value {
color: @attr-value;
}
}
}
.comment {
.wrap;
.italic;
color: @comment;
}
.text {
color: @text;
}
span.text { padding: 0 @text-spacing; }
}
/* Debugging output */
@msg-border: dotted 1px #888;
#debug-messages {
margin: 2em 10%;
font: @mono-font;
dt, dd {
padding: 4px 0;
}
dt {
font-weight: bold;
float: left;
clear: left;
width: 15%;
&:first {
border-top: @msg-border;
}
}
dd {
margin-left: 2em;
border-bottom: @msg-border;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment