I looked into Muenchian grouping, but I don't think that is necessary here
Well, you do need something to get only distinct diagnoses - either Muenchian grouping or some variation on the theme. Here's a quick demo of how it could work:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="diag-by-case" match="rootDiagnoses/row" use="CaseID" />
<xsl:key name="diag-by-diag" match="rootDiagnoses/row" use="DiagnoseID" />
<xsl:template match="/">
<output>
<xsl:for-each select="rootCases/caselist/row">
<case id="{CaseID}">
<!-- for each unique diagnosis -->
<xsl:for-each select="key('diag-by-case', CaseID)[count(. | key('diag-by-diag', DiagnoseID)[1]) = 1]">
<diagnosis id="{DiagnoseID}">
</diagnosis>
</xsl:for-each>
</case>
</xsl:for-each>
</output>
</xsl:template>
</xsl:stylesheet>
Applied to your input, the following result is obtained:
<?xml version="1.0" encoding="UTF-8"?>
<output>
<case id="2736">
<diagnosis id="15569"/>
<diagnosis id="15570"/>
</case>
</output>
Alternatively, you could use the EXSLT distinct() function, if your processor supports it.
Edit:
Here's an expanded version that gets closer to your intended result:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:key name="diag-by-case" match="rootDiagnoses/row" use="CaseID" />
<xsl:key name="diag-by-diag" match="rootDiagnoses/row" use="DiagnoseID" />
<xsl:template match="/">
<output>
<xsl:for-each select="rootCases/caselist/row">
<case id="{CaseID}">
<!-- for each unique diagnosis -->
<xsl:for-each select="key('diag-by-case', CaseID)[count(. | key('diag-by-diag', DiagnoseID)[1]) = 1]">
<diagnosis id="{DiagnoseID}">
<ais2005Code><xsl:value-of select="AIS"/></ais2005Code>
<descriptionDiagnosis><xsl:value-of select="Description"/></descriptionDiagnosis>
<!-- get surgery -->
<xsl:for-each select="key('diag-by-diag', DiagnoseID)[Main_surgery='true']">
<surgery1>
<date><xsl:value-of select="SurgeryDate"/></date>
<description><xsl:value-of select="Operation_text"/></description>
</surgery1>
</xsl:for-each>
</diagnosis>
</xsl:for-each>
</case>
</xsl:for-each>
</output>
</xsl:template>
Result:
<?xml version="1.0" encoding="UTF-8"?>
<output>
<case id="2736">
<diagnosis id="15569">
<ais2005Code>854471.2</ais2005Code>
<descriptionDiagnosis>Fibula fracture, shaft on left</descriptionDiagnosis>
</diagnosis>
<diagnosis id="15570">
<ais2005Code>854251.2</ais2005Code>
<descriptionDiagnosis>Tibia fracture shaft on left</descriptionDiagnosis>
<surgery1>
<date>2012-03-13</date>
<description>Reductio et laminofixatio Reductio et laminofixatio</description>
</surgery1>
</diagnosis>
</case>
</output>