On second thoughts, you first need to rethink the design of your input
document.
You have:
<returnType>Person</returnType>
and then:
<param type="Person" name="p"/>
These are the same 'Person' but you are using different markup for the
two. You will find things much easier if you are consistent.
I would choose an element for this kind of thing. You could rewrite
your input document (adding some missing tags) as:
<program>
<method name="getPerson">
<returnType><type>Person</type></returnType>
<params/>
</method>
<method name="setPerson">
<returnType/>
<params>
<param name="p"><type>Person</type></param>
</params>
</method>
</program>
Then, using xsl:key as suggested by others your #include is very easy:
<xsl:key name="types" match="type" use="." />
<xsl:key name="types" match="type" use="'_all_'" />
<xsl:template match="/" >
<xsl:for-each select="key('types', '_all_')">
<xsl:if test="count(.|key('types', .)[1])=1">
<xsl:text>include "</xsl:text>
<xsl:value-of select="." />
<xsl:text>.h"
</xsl:text>
</xsl:if>
</xsl:for-each>
</xsl:template>
Notes: "key('types', '_all_')" is the same as "//type" but may be a
little faster.
"count(.|key('types', .)[1])=1" is finding out if the current node is
the first one with this name. It relies on the union operator on
node-sets throwing away duplicates.
Trevor Nash
--
Traditional training & distance learning,
Consultancy by email
Melvaig Software Engineering Limited
voice: +44 (0) 1445 771 271
email: tcn(_at_)melvaig(_dot_)co(_dot_)uk
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list