To understand the script and the following output, you need the xmi.id's of the types involved:
| Type | Id |
| int | S.100006 |
| String | S.100003 |
| Return2 | S.100082 |
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/XSL/Transform/1.0"
xmlns:xt="http://www.jclark.com/xt"
extension-element-prefixes="xt">
<xsl:template match="XMI">
<xsl:text>
</xsl:text>
<XMI>
<xsl:apply-templates select="XMI.content">
</xsl:apply-templates>
<xsl:text>
</xsl:text>
</XMI>
</xsl:template>
<xsl:template match="XMI.content">
<xsl:text>
</xsl:text>
<XMI.content>
<xsl:apply-templates select="Model">
</xsl:apply-templates>
<xsl:text>
</xsl:text>
</XMI.content>
</xsl:template>
<xsl:template match="Model">
<xsl:text>
</xsl:text>
<Model name="{name}">
<xsl:apply-templates select="ownedElement">
</xsl:apply-templates>
<xsl:text>
</xsl:text>
</Model>
</xsl:template>
<xsl:template match="ownedElement">
<xsl:apply-templates select="Model|Class" />
</xsl:template>
<xsl:template match="Class">
</xsl:template>
<xsl:template match="Class[@XMI.id='S.100027']" priority="2">
<xsl:text>
</xsl:text>
<Class name="{name}">
<xsl:apply-templates select="feature" />
<xsl:text>
</xsl:text>
</Class>
</xsl:template>
<xsl:template match="feature">
<xsl:apply-templates select="Operation" />
</xsl:template>
<xsl:template match="Operation">
</xsl:template>
<xsl:template match="Operation[name='operation']" priority="2">
<xsl:text>
</xsl:text>
<Operation name="{name}">
<xsl:apply-templates
select="parameter[1]/Parameter[1]/type[1]/XMI.reference[1]"
mode="P1"/>
<xsl:text>
</xsl:text>
</Operation>
</xsl:template>
<xsl:template match="XMI.reference">
</xsl:template>
<xsl:template match="XMI.reference[@target='S.100003']" mode="P1" priority="2">
<xsl:text>
IS_OK_1</xsl:text>
<xsl:apply-templates
select="../../../../parameter[2]/Parameter[1]/type[1]/XMI.reference[1]"
mode="P2"/>
</xsl:template>
<xsl:template match="XMI.reference[@target='S.100006']" mode="P2" priority="2">
<xsl:text>
IS_OK_2</xsl:text>
<xsl:apply-templates
select="../../../../parameter[3]/Parameter[1]/type[1]/XMI.reference[1]"
mode="PR"/>
</xsl:template>
<xsl:template match="XMI.reference" mode="PR" priority="2">
<xsl:text>
[</xsl:text>
<xsl:value-of select="@target"/>
<xsl:text>]</xsl:text>
</xsl:template>
</xsl:stylesheet>
Apart from the query result, the script produces debugging output, which may be used to trace the path of the query processor through the document.
<XMI>
<XMI.content>
<Model name="untitledpackage">
<Class name="someClass">
<Operation name="operation">
</Operation>
<Operation name="operation">
IS_OK_1
IS_OK_2
[S.100082]
</Operation>
<Operation name="operation">
</Operation>
</Class>
</Model>
</XMI.content>
</XMI>
Again, the id's for types involved:
| Type | Id |
| A1 | S.100027 |
| A2 | S.100073 |
| A3 | S.100074 |
| B1 | S.100075 |
| B2 | S.100076 |
| B3 | S.100077 |
| C1 | S.100078 |
| C2 | S.100079 |
| C3 | S.100080 |
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/XSL/Transform/1.0"
xmlns:xt="http://www.jclark.com/xt"
extension-element-prefixes="xt">
<xsl:template match="XMI">
<xsl:param name="sub" >S.100079</xsl:param>
<xsl:param name="super">S.100074</xsl:param>
<xsl:text>
</xsl:text>
<XMI sub="{$sub}" super="{$super}">
<xsl:apply-templates select="XMI.content">
<xsl:with-param name="sub" ><xsl:value-of select="$sub" /></xsl:with-param>
<xsl:with-param name="super"><xsl:value-of select="$super" /></xsl:with-param>
</xsl:apply-templates>
<xsl:text>
</xsl:text>
</XMI>
</xsl:template>
<xsl:template match="XMI.content">
<xsl:param name="sub" >nixxsub</xsl:param>
<xsl:param name="super">nixxsuper</xsl:param>
<xsl:text>
</xsl:text>
<XMI.content sub="{$sub}" super="{$super}">
<xsl:apply-templates select="Model">
<xsl:with-param name="sub" ><xsl:value-of select="$sub" /></xsl:with-param>
<xsl:with-param name="super"><xsl:value-of select="$super" /></xsl:with-param>
</xsl:apply-templates>
<xsl:text>
</xsl:text>
</XMI.content>
</xsl:template>
<xsl:template match="Model">
<xsl:param name="sub" >nixxsub</xsl:param>
<xsl:param name="super">nixxsuper</xsl:param>
<xsl:text>
</xsl:text>
<Model name="{name}" sub="{$sub}" super="{$super}">
<xsl:apply-templates select="ownedElement">
<xsl:with-param name="sub" ><xsl:value-of select="$sub" /></xsl:with-param>
<xsl:with-param name="super"><xsl:value-of select="$super" /></xsl:with-param>
</xsl:apply-templates>
<xsl:text>
</xsl:text>
</Model>
</xsl:template>
<xsl:template match="ownedElement">
<xsl:param name="sub" >nixxsub</xsl:param>
<xsl:param name="super">nixxsuper</xsl:param>
<xsl:apply-templates select="Model|Generalization">
<xsl:with-param name="sub" ><xsl:value-of select="$sub" /></xsl:with-param>
<xsl:with-param name="super"><xsl:value-of select="$super" /></xsl:with-param>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="Generalization">
</xsl:template>
<xsl:template match="Generalization[subtype[XMI.reference[@target=$sub]]]"
priority="2">
<xsl:param name="sub" >nixxsub</xsl:param>
<xsl:param name="super">nixxsuper</xsl:param>
<xsl:text>
</xsl:text>
<Generalization name="{@XMI.id}" sub="{$sub}" super="{$super}">
<xsl:apply-templates select="supertype" mode="supertype">
<xsl:with-param name="super"><xsl:value-of select="$super" /></xsl:with-param>
</xsl:apply-templates>
<xsl:text>
</xsl:text>
</Generalization>
</xsl:template>
<xsl:template match="supertype[XMI.reference[@target=$super]]"
priority="2"
mode="supertype">
<xsl:text>
</xsl:text>
<supertype super="{$super}">
<xsl:text>
[TRUE]</xsl:text>
<xsl:text>
</xsl:text>
</supertype>
</xsl:template>
<xsl:template match="supertype" mode="supertype">
<xsl:param name="super">nixxsuper</xsl:param>
<xsl:text>
</xsl:text>
<supertype super="{$super}">
<xsl:apply-templates select="XMI.reference" mode="supertype">
<xsl:with-param name="super"><xsl:value-of select="$super" /></xsl:with-param>
</xsl:apply-templates>
<xsl:text>
</xsl:text>
</supertype>
</xsl:template>
<xsl:template match="XMI.reference" mode="supertype">
<xsl:param name="super">nixxsuper</xsl:param>
<xsl:variable name="nextsub" select="@target" />
<xsl:text>
</xsl:text>
<XMI.reference super="{$super}" nextsub="{$nextsub}">
<xsl:apply-templates select="/XMI/XMI.content">
<xsl:with-param name="sub" ><xsl:value-of select="$nextsub" /></xsl:with-param>
<xsl:with-param name="super"><xsl:value-of select="$super" /></xsl:with-param>
</xsl:apply-templates>
<xsl:text>
</xsl:text>
</XMI.reference>
</xsl:template>
</xsl:stylesheet>
<XMI super="S.100074" sub="S.100079">
<XMI.content super="S.100074" sub="S.100079">
<Model super="S.100074" sub="S.100079" name="untitledpackage">
<Generalization super="S.100074" sub="S.100079" name="S.100086">
<supertype super="S.100074">
<XMI.reference nextsub="S.100075" super="S.100074">
<XMI.content super="S.100074" sub="S.100075">
<Model super="S.100074" sub="S.100075" name="untitledpackage">
<Generalization super="S.100074" sub="S.100075" name="S.100081">
<supertype super="S.100074">
<XMI.reference nextsub="S.100073" super="S.100074">
<XMI.content super="S.100074" sub="S.100073">
<Model super="S.100074" sub="S.100073" name="untitledpackage">
</Model>
</XMI.content>
</XMI.reference>
</supertype>
</Generalization>
<Generalization super="S.100074" sub="S.100075" name="S.100135">
<supertype super="S.100074">
<XMI.reference nextsub="S.100027" super="S.100074">
<XMI.content super="S.100074" sub="S.100027">
<Model super="S.100074" sub="S.100027" name="untitledpackage">
</Model>
</XMI.content>
</XMI.reference>
</supertype>
</Generalization>
</Model>
</XMI.content>
</XMI.reference>
</supertype>
</Generalization>
<Generalization super="S.100074" sub="S.100079" name="S.100087">
<supertype super="S.100074">
<XMI.reference nextsub="S.100077" super="S.100074">
<XMI.content super="S.100074" sub="S.100077">
<Model super="S.100074" sub="S.100077" name="untitledpackage">
<Generalization super="S.100074" sub="S.100077" name="S.100084">
<supertype super="S.100074">
<XMI.reference nextsub="S.100073" super="S.100074">
<XMI.content super="S.100074" sub="S.100073">
<Model super="S.100074" sub="S.100073" name="untitledpackage">
</Model>
</XMI.content>
</XMI.reference>
</supertype>
</Generalization>
<Generalization super="S.100074" sub="S.100077" name="S.100137">
<supertype super="S.100074">
[TRUE]
</supertype>
</Generalization>
</Model>
</XMI.content>
</XMI.reference>
</supertype>
</Generalization>
<Generalization super="S.100074" sub="S.100079" name="S.100139">
<supertype super="S.100074">
<XMI.reference nextsub="S.100076" super="S.100074">
<XMI.content super="S.100074" sub="S.100076">
<Model super="S.100074" sub="S.100076" name="untitledpackage">
<Generalization super="S.100074" sub="S.100076" name="S.100082">
<supertype super="S.100074">
<XMI.reference nextsub="S.100027" super="S.100074">
<XMI.content super="S.100074" sub="S.100027">
<Model super="S.100074" sub="S.100027" name="untitledpackage">
</Model>
</XMI.content>
</XMI.reference>
</supertype>
</Generalization>
<Generalization super="S.100074" sub="S.100076" name="S.100083">
<supertype super="S.100074">
[TRUE]
</supertype>
</Generalization>
<Generalization super="S.100074" sub="S.100076" name="S.100136">
<supertype super="S.100074">
<XMI.reference nextsub="S.100073" super="S.100074">
<XMI.content super="S.100074" sub="S.100073">
<Model super="S.100074" sub="S.100073" name="untitledpackage">
</Model>
</XMI.content>
</XMI.reference>
</supertype>
</Generalization>
</Model>
</XMI.content>
</XMI.reference>
</supertype>
</Generalization>
</Model>
</XMI.content>
</XMI>