In XSLT, white-space is preserved by default, since it can very well be relevant data.
The best way to prevent unwanted white-space in the output is not to create it in the first place. Don’t do:
<xsl:template match="foo">
foo
</xsl:template>
because that’s "\n··foo\n", from the processor’s point of view. Rather do
<xsl:template match="foo">
<xsl:text>foo</xsl:text>
</xsl:template>
White-space in the stylesheet is ignored as long as it occurs between XML elements only. Simply put: never use “naked” text anywhere in your XSLT code, always enclose it in an element.
Also, using an unspecific:
<xsl:apply-templates />
is problematic, because the default XSLT rule for text nodes says “copy them to the output”. This applies to “white-space-only” nodes as well. For instance:
<xml>
<data> value </data>
</xml>
contains three text nodes:
"\n··"(right after<xml>)"·value·"- “
\n"(right before</xml>)
To avoid that #1 and #3 sneak into the output (which is the most common reason for unwanted spaces), you can override the default rule for text nodes by declaring an empty template:
<xsl:template match="text()" />
All text nodes are now muted and text output must be created explicitly:
<xsl:value-of select="data" />
To remove white-space from a value, you could use the normalize-space() XSLT function:
<xsl:value-of select="normalize-space(data)" />
But careful, since the function normalizes any white-space found in the string, e.g. "·value··1·" would become "value·1".
Additionally you can use the <xsl:strip-space> and <xsl:preserve-space> elements, though usually this is not necessary (and personally, I prefer explicit white-space handling as indicated above).