The following solution works for any field name and any number of fields. The format of your data suggests that the field names might be dynamic. It also doesn't assume that the field children will always be named "string". (The name "string" made me suspicious that other data types might appear. Whether they do or not, this solution will still work.)
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="/">
<records>
<!-- Just process the first field's children,
to get the list of line items -->
<xsl:apply-templates select="/recordset/field[1]/*"/>
</records>
</xsl:template>
<!-- Convert each field child to a line item -->
<xsl:template match="field/*">
<item_line>
<!-- Then query all the fields for the value at this position -->
<xsl:apply-templates select="/recordset/field">
<xsl:with-param name="pos" select="position()"/>
</xsl:apply-templates>
</item_line>
</xsl:template>
<xsl:template match="field">
<xsl:param name="pos"/>
<!-- Convert the field name to lower case -->
<xsl:element name="{translate(
@name,
'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'abcdefghijklmnopqrstuvwxyz'
)}">
<xsl:value-of select="*[$pos]"/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Let me know if you have any questions.
EDIT: A streamlined version of the above:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:template match="/">
<records>
<xsl:for-each select="/recordset/field[1]/*">
<xsl:variable name="pos" select="position()" />
<item_line>
<xsl:apply-templates select="/recordset/field/*[$pos]" />
</item_line>
</xsl:for-each>
</records>
</xsl:template>
<xsl:template match="field/*">
<xsl:element name="{translate(
../@name,
'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
'abcdefghijklmnopqrstuvwxyz'
)}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>