Похоже, вы спрашиваете, что вы хотите сопоставить все элементы tag с name из 72 и объединить значения в одну строку.
В данный момент вы вкладываете свои xsl: for-each операторы, в результате чего элементы выбираются дважды, а ваша строка вывода дублируется.
Что вам нужно сделать, это просто выбрать первый тег, например, так:
<xsl:value-of select="block4/tag[name = '72'][1]/value"/>
И тогда вы можете получить оставшиеся теги примерно так ...
<xsl:for-each select="block4/tag[name = '72'][position() > 1]">
Обратите внимание, что было бы предпочтительно использовать xsl: apply-templates для сопоставления узлов, а не xsl: for-each .
Вот полный XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/">
<xsl:apply-templates select="local/message"/>
</xsl:template>
<xsl:template match="message">
<xsl:value-of select="block4/tag[name = '72'][1]/value"/>
<xsl:apply-templates select="block4/tag[name = '72'][position() > 1]"/>
</xsl:template>
<xsl:template match="tag">
<xsl:text>,</xsl:text>
<xsl:value-of select="value"/>
</xsl:template>
</xsl:stylesheet>
При применении к заданному вами входному XML, вывод будет следующим:
ALW103111102000001,ipubby