XSLT 1.0 Solution
This XSLT 1.0 style-sheet...
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="/">
<xsl:variable name="strip-chars" select=""[]''"" />
<xsl:for-each select="*">
<xsl:copy>
<xsl:call-template name="tokenize">
<xsl:with-param name="content" select="concat(translate(@Icons,$strip-chars,''),',')" />
<xsl:with-param name="count" select="3" />
</xsl:call-template>
</xsl:copy>
</xsl:for-each>
</xsl:template>
<xsl:template name="tokenize">
<xsl:param name="content" />
<xsl:param name="count" />
<xsl:if test="contains($content,',') and $count > 0">
<img src="{substring-before($content,',')}" alt="" />
<xsl:call-template name="tokenize">
<xsl:with-param name="content" select="normalize-space(substring-after($content,','))" />
<xsl:with-param name="count" select="$count - 1" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
...when applied to this input document...
<t Icons="['http://www.test.com/image1.jpg',
'http://www.test.com/image2.jpg',
'http://www.test.com/image3.jpg',
'http://www.test.com/image4.jpg',
'http://www.test.com/image5.jpg']"/>
...will yield...
<t>
<img src="http://www.test.com/image1.jpg" alt="" />
<img src="http://www.test.com/image2.jpg" alt="" />
<img src="http://www.test.com/image3.jpg" alt="" />
</t>
And when applied to this short input document...
<t Icons="['http://www.test.com/image1.jpg',
'http://www.test.com/image2.jpg']"/>
...yields...
<t>
<img src="http://www.test.com/image1.jpg" alt="" />
<img src="http://www.test.com/image2.jpg" alt="" />
</t>
Note
Suresh's solution, as at time of edit, will not work for this second use case in which the count of images is 3 or less.
XSLT 2.0 Solution
The same outcome can be reached simpler, more efficiently and more extensibly with XSLT 2.0 with a style-sheet like this...
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="/">
<xsl:for-each select="*">
<xsl:copy>
<xsl:variable name="image-elements" as="element()*">
<xsl:analyze-string select="@Icons" regex="'([^']*)'(,|\])" >
<xsl:matching-substring>
<img src="{regex-group(1)}" alt="" />
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:variable>
<xsl:copy-of select="$image-elements[not(position() > 3)]" />
</xsl:copy>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
XSLT 2.0 XPATH Solution
For interest, here is a variation for XSLT 2.0 using purely XPATH.
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="/">
<xsl:for-each select="*">
<xsl:copy>
<xsl:for-each select="(for $i in tokenize(@Icons,',') return
replace($i,'.*''([^'']*)''.*','$1'))
[not(position() > 3)]">
<img src="{.}" alt="" />
</xsl:for-each>
</xsl:copy>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Update and Comment on Dimitre's Solution
Congradulations to Dimitre for his more concise XSLT 2.0 Solution. He uses a slightly different input from mine that does not have the square brackets in it. Looking at Dimitre's solution, I can see a tweak to make it signficantly smaller still.
This XSLT 2.0 style-sheet, a tweak on Dimitre's solution, is the tightest of all solutions, and as a bonus works on both my form of input document, and his, to produce the same and correct result document.
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="/">
<xsl:for-each select="tokenize(/*/@Icons, '\[?\s*''\s*,?\]?')[.][position() le 3]">
<img src="{.}" alt=""/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>