Michael Kay et al
Here's a selection, of varying degrees of obviousness. General-purpose:
Add <xsl:message> to output progress messages
Add <xsl:comment> to put messages into the result tree indicating
where output nodes came from
Use <xsl:comment><xsl:value-of
select="system-property('xsl:vendor')"/></xsl:comment> so you are in no
doubt about which XSLT processor you are using To output the values of variables, using attribute value templates is
quicker than using xsl:value-of, e.g. write <debug x="{$x}" y="{$y}"/>
If you want to leave debug lines in the stylesheet that can be
switched on and off at will, make them into extension elements:
<xsl:stylesheet xmlns:debug="debug.uri"
extension-element-prefixes="debug">
...
<debug:debug x="{$x}" y="{$y}"><xsl:fallback/></debug:debug>
The <debug:debug> element will be ignored, but values will be output
if "debug" is removed from the "extension-element-prefixes" attribute.
To see what's in a temporary tree (or result tree fragment), copy it
to the output:
<debug tree="$x">
<xsl:copy-of select="$x"/>
</debug>
To add tracing to all template rules, add a debug module:
<xsl:import href="real-stylesheet.xsl"/>
<xsl:template match="*">
<xsl:message>Processing <xsl:value-of
select="name()"/></xsl:message>
<xsl:apply-imports/>
<xsl:message>Finished processing <xsl:value-of
select="name()"/></xsl:message>
</xsl:template>
(You can also use xsl:comment instead of xsl:message)
To deal with character-encoding problems: use a hex editor!
If the source (or result) XML is badly laid out and difficult to
understand, run it through an indentation transform:
<xsl:strip-space elements="*"/>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:copy-of select="."/>
</xsl:template>
If you don't understand the error messages from your XSLT processor
(or if you are beginning to suspect that it has a bug), run the
transformation through another XSLT processor to see if it sheds any
light on the matter.
Saxon-specific:
Use -T on the command line to switch on tracing
Use saxon:path() to output an XPath expression that identifies the
context node
Use saxon:line-number() to output the line number of the context node
in the source file (having switched on numbering using -l on the command
line)
In 7.x only: add type declarations on variables and parameters, e.g.
<xsl:param name="x" as="xs:integer"/> to trap type errors.
MSXML3-specific:
Get your transformation working in standalone mode first, before you
integrate it into the browser. Write the version used in the browser as
a customisation layer (using xsl:import) of the standalone version, and
when debugging is necessary, use the standalone version. Try to avoid
debugging in the browser. |