The reason for this is that <xsl:value-of> returns the textual content of a element or set of elements. <br/> is an empty br element with no text in it.
On the other hand <xsl:copy-of> copies the entire tree of the selected node or node-set, including the elements and text.
Code:
<xsl:variable name="test">
<element>test</element>
</xsl:variable>
<xsl:value-of select="$test"/> <!-- outputs "test" only -->
<xsl:copy-of select="$test"/> <!-- outputs "<element>test</element>" -->
Your first two example should have successfully outputted a line break, but if viewed in a browser this line break has no effect on the actual display of the text, as you have probably seen.
Code:
<p>This line has a
break in it.</p>
<p>This line has a <br/> line break element in it.</p>
when viewed in a browser will simply view as
Code:
This line has a break in it.
This line has a
line break element in it.