Вы можете получить собранные конкататы довольно просто с помощью небольшой рекурсии, если вы смотрите на набор узлов (при условии, что вы можете создать xpath для поиска набора узлов), делая это так, чтобы вы могли добавьте произвольные биты и кусочки в поток и из него он станет грязным.
Попробуйте это для начала (присоединиться тоже):
<xsl:template match="/">
<xsl:variable name="s">
<xsl:call-template name="stringbuilder">
<xsl:with-param name="data" select="*" /><!-- your path here -->
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$s" /><!-- now contains a big concat string -->
</xsl:template>
<xsl:template name="stringbuilder">
<xsl:param name="data"/>
<xsl:param name="join" select="''"/>
<xsl:for-each select="$data/*">
<xsl:choose>
<xsl:when test="not(position()=1)">
<xsl:value-of select="concat($join,child::text())"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="child::text()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</xsl:template>
Могут потребоваться все возможные расширения: возможно, вы хотите обрезать, возможно, вы также хотите туннелировать через иерархии. Я не уверен, что существует пуленепробиваемое общее решение.