Вы можете просто сделать xsl:for-each
для всех ATOM, которые не имеют атрибута STATE.Вы можете разделить это с чем-то вроде «OTHER».
Эта измененная версия вашей таблицы стилей:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="PERIODIC_TABLE">
<xsl:for-each-group select="ATOM" group-by="@STATE">
<xsl:text> ** </xsl:text>
<xsl:value-of select="current-grouping-key()"/>
<xsl:text>
</xsl:text>
<xsl:for-each select="current-group()">
<xsl:sort select="NAME" case-order="#default"/>
<xsl:value-of select="NAME"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
<xsl:text>
</xsl:text>
</xsl:for-each-group>
<xsl:if test="ATOM[not(@STATE)]">
<xsl:text> ** OTHER
</xsl:text>
<xsl:for-each select="ATOM[not(@STATE)]">
<xsl:sort select="NAME" case-order="#default"/>
<xsl:value-of select="NAME"/>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
производит следующий вывод (во всей своей красе):
** GAS
Argon
Helium
Hydrogen
Xenon
** SOLID
Bismuth
Carbon
Gold
** OTHER
Actinium
Aluminum
Americium
Antimony
Arsenic
Astatine
Barium
Berkelium
Beryllium
Bohrium
Boron
Bromine
Cadmium
Calcium
Californium
Cerium
Cesium
Chlorine
Chromium
Cobalt
Copper
Curium
Dubnium
Dysprosium
Einsteinium
Erbium
Europium
Fermium
Fluorine
Francium
Gadolinium
Gallium
Germanium
Hafnium
Hassium
Holmium
Indium
Iodine
Iridium
Iron
Krypton
Lanthanum
Lawrencium
Lead
Lithium
Lutetium
Magnesium
Manganese
Meitnerium
Mendelevium
Mercury
Molybdenum
Neodymium
Neon
Neptunium
Nickel
Niobium
Nitrogen
Nobelium
Osmium
Oxygen
Palladium
Phosphorus
Platinum
Plutonium
Polonium
Potassium
Praseodymium
Promethium
Protactinium
Radium
Radon
Rhenium
Rhodium
Rubidium
Ruthenium
Rutherfordium
Samarium
Scandium
Seaborgium
Selenium
Silicon
Silver
Sodium
Strontium
Sulfur
Tantalum
Technetium
Tellurium
Terbium
Thallium
Thorium
Thulium
Tin
Titanium
Tungsten
ununbium
ununnilium
unununium
Uranium
Vanadium
Ytterbium
Yttrium
Zinc
Zirconium
Несколько других вещей, которые я сделал, это добавили атрибуты case-order
к элементам xsl:sort
, и я использовал 

шестнадцатеричную ссылку на сущность для перевода строки.здесь можно использовать concat()
вместо отдельного xsl:text
для новых строк / пробелов.
Вместо этого:
<xsl:value-of select="NAME"/>
<xsl:text>
</xsl:text>
вы можете сделать это:
<xsl:value-of select="concat(NAME,'
')"/>