Вот как это можно сделать:
<xsl:output method="xml" />
<xsl:template match="/"><xsl:apply-templates select="/a/b" mode="normalize-space" /></xsl:template>
<xsl:template match="text()" mode="normalize-space"><xsl:value-of select="normalize-space(.)" /></xsl:template>
<xsl:template match="@*|node()" mode="normalize-space"><xsl:copy><xsl:apply-templates select="@*|node()" mode="normalize-space" /></xsl:copy></xsl:template>
Этот метод копирует узлы, узлы с пространствами имен и атрибутами.
Метод требует, чтобы выходные данные были «xml» (а не «text», как в исходном образце). Он использует пользовательский шаблон для всех узлов TEXT, чтобы нормализовать пространство внутри них (удалить начальные / конечные пробелы, объединить несколько пробелов в один пробел). Затем он использует простой «идентификационный» шаблон, который копирует все узлы и их атрибуты. Оба шаблона используют специальный режим, чтобы не мешать остальному XSL.
К сожалению, процессор XSLT копирует все «неизвестные» узлы внутри тега xsl: template в выходной документ, и пробелы являются одним из таких узлов. Вот почему все эти шаблоны должны быть записаны в одну строку без лишних пробелов.
PS Хотя я согласен с тем, что поиск нормализованного XML в СУБД довольно странен.