In one of the comments (to a now-deleted answer) you said your input looks like this:
<image>
someimage.jpg</image>
This is where your newline comes from - it is part of the node value and is therefore retained by the XSL processor (it is not "added", as you suspected).
To remove the space, you must modify the node value before you output it, best suited in this case is the normalize-space()
function, since URLs do not contain spaces, generally.
<td>
<img src="{normalize-space(image)}"/>
</td>
If you have any chance, this should be fixed in the process that generates the input XML, since the XML itself is already wrong. If the newline is not part of the data, it should not be there in the first place.
Contrary to what many others here proposed, your XSLT code layout has no influence on the output. All whitespace is stripped from the XSL stylesheet before processing begins, so this:
<td>
<xsl:element name="img">
<xsl:attribute name="src">
<xsl:value-of select="image" />
</xsl:attribute>
</xsl:element>
</td>
though unnecessarily verbose, is equivalent to this:
<td>
<xsl:element name="img"><xsl:attribute name="src"><xsl:value-of select="image" /></xsl:attribute>
</xsl:element>
</td>
is equivalent to this, as far as output whitespace is concerned:
<td><img src="{image}"/></td>
However, if stray text nodes are in your XSL code, all whitespace around them is retained. This means you should not do this:
<td>
Stray Text
</td>
Since this would generate a "\n Stray Text\n "
text node in the output. Better is:
<td>
<xsl:text>Contained Text</xsl:text>
</td>
In regard to: "But why does <xsl:strip-space>
not work?" I recommend reading Pavel Minaev's answer to exactly this question.