I'm a bit puzzled by your problem because your code seems to be written very carefully to select the first Shipping Date. Let's walk through it:
<xsl:for-each select="ShippingDate">
-- for each ShippingDate in the input
<xsl:element name="ShippingDate">
-- create a ShippingDate in the output
<xsl:variable name="EarlDel" select="../ShippingDate"/>
-- create a variable whose value is the set of all ShippingDate elements owned by the parent of this ShippingDate
<xsl:attribute name="DateTimeType">Earliest Delivery</xsl:attribute>
-- create an attribute whose name is "DateTimeType" and whose value is the string "Earliest Delivery"
<xsl:value-of select="$EarlDel"/>
-- output the string-value of the first node in the set $EarlDel, that is, the first child of the parent ShippingInstructions.
If you want to output the current node, just do <xsl:value-of select="."/> in the usual way, but then all the stuff about labelling it as the "earliest delivery" is nonsense.
Michael Kay
http://www.saxonica.com/
Author, XSLT Programmer's Reference and XPath 2.0 Programmer's Reference