Я бы, вероятно, использовал таблицу стилей XSLT для решения этой проблемы. Я создал следующую таблицу стилей, чтобы она была немного общей и соответствовала именно тому, о чем вы просили, но ее можно легко изменить, чтобы получить точный вывод, который вы указали, если вам действительно нужен именно такой вывод.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:apply-templates select="/*"/>
</xsl:template>
<xsl:template match="/*">
<xsl:copy>
<xsl:copy-of select="*"/>
<xsl:element name="nodes">
<xsl:apply-templates select="*[normalize-space(.) = 'true']"/>
</xsl:element>
</xsl:copy>
</xsl:template>
<xsl:template match="/*/*">
<xsl:value-of select="concat(',', local-name())"/>
</xsl:template>
<xsl:template match="/*/*[1]">
<xsl:value-of select="local-name()"/>
</xsl:template>
</xsl:stylesheet>
Этот вывод XSLT будет:
<page>
<audience1>
true
</audience1>
<audience2>
false
</audience2>
<audience3>
true
</audience3>
<audience4>
false
</audience4>
<audience5>
true
</audience5>
<nodes>audience1,audience3,audience5</nodes>
</page>
XSLT подойдет для этого, потому что вы можете использовать практически любой язык программирования или использовать Visual Studio для применения шаблона. Существует также множество бесплатных инструментов , которые можно использовать для применения преобразований.