Создайте шаблон, который соответствует всем пользователям, а затем извлеките необходимую информацию в нужном вам порядке:
<xsl:template match="//User">
<xsl:value-of select="Contact/@FirstName"/>,
<xsl:value-of select="Contact/@LastName"/>,
<!--etc-->
</xsl:template>
Очевидно, вам нужно убедиться, что пробелы обрабатываются так, как вы хотите, с символами новой строки в нужных местах. Я оставлю это читателю в качестве упражнения.
По моему опыту, я всегда использовал XSLT на стороне клиента, а не на стороне сервера, что вы, похоже, пытаетесь использовать с C #
Я всегда предпочитаю позволить браузеру обрабатывать XML, освобождая сервер от выполнения более сложной работы. Тем не менее, вот образец XSLT, который должен переводить ваш XML и представлять его в формате CSV, как показано выше.
Надеюсь, этот образец кода поможет, если нет, дайте мне знать.
<xsl:stylesheet version="1.0">
<xsl:template match="/">
<table>
<xsl:for-each select="//User">
<tr>
<td>
<xsl:value-of select="conat('[', @ID, ']')"/>
<xsl:value-of select="','"/>
<xsl:value-of select="Contact/@FirstName"/>
<xsl:value-of select="','"/>
<xsl:value-of select="Contact/@LastName"/>
<xsl:value-of select="','"/>
<xsl:value-of select="Address/@Street1"/>
<xsl:value-of select="','"/>
<xsl:value-of select="Address/@City"/>
<xsl:value-of select="','"/>
<xsl:value-of select="Address/@State"/>
</td>
</tr>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>