Попробуйте это:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="SOLUTIONS">
<FMs>
<xsl:apply-templates />
</FMs>
</xsl:template>
<xsl:template match="SOLUTION">
<FailureMode CommonKey="{TITLE/@Common_Key}" FMName="{TITLE}" />
</xsl:template>
<xsl:template match="SOLUTION[preceding-sibling::SOLUTION/TITLE = TITLE]" />
</xsl:stylesheet>
Последний шаблон в основном переопределяет предыдущий, где есть предыдущий узел SOLUTION с тем же заголовком, что и текущий, и ничего не выводит.
В качестве альтернативы, это можно сделать с помощью клавиши:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="FMName" match="SOLUTION" use="TITLE" />
<xsl:template match="SOLUTIONS">
<FMs>
<xsl:apply-templates />
</FMs>
</xsl:template>
<xsl:template match="SOLUTION">
<xsl:if test="generate-id() = generate-id(key('FMName',TITLE)[1])">
<FailureMode CommonKey="{TITLE/@Common_Key}" FMName="{TITLE}" />
</xsl:if>
</xsl:template>
</xsl:stylesheet>
В этом решении xsl:if
используется только для включения узлов, которые являются первым узлом с заданным именем.
В этом случае я бы лично порекомендовал первый метод, но последний может быть более гибким с более сложной структурой XML.