Это всего лишь один способ, предполагая простой пример ввода.
<xsl:template match="/">
<xsl:for-each select="//String">
<xsl:value-of select="."/><xsl:if test="not(position() = last())">|</xsl:if>
</xsl:for-each>
</xsl:template>
Вот более конкретное правило шаблона, если я понимаю добавленный вами комментарий. Было бы здорово, если бы человек, который прокомментировал использование last (), также разместил образец.
<xsl:template match="Attribute[@name='forms']">
<xsl:for-each select="List//String">
<xsl:value-of select="."/><xsl:if test="not(position() = last())">|</xsl:if>
</xsl:for-each>
</xsl:template>