Mercurial > pub > ModelGenerator
diff xslt/model.xsl @ 7:3fe157be5141
sync
author | cin |
---|---|
date | Tue, 06 Mar 2018 19:27:25 +0300 |
parents | 1f4009d4afb6 |
children | 5fe2e5724331 |
line wrap: on
line diff
--- a/xslt/model.xsl Mon Mar 05 10:37:47 2018 +0300 +++ b/xslt/model.xsl Tue Mar 06 19:27:25 2018 +0300 @@ -167,4 +167,85 @@ </xsl:call-template> </xsl:template> + <!-- expand-member templates are used to process relations + and keys and provide usefull information like properties of + the entity which are members of this relation or key. + + @special - means that the member is a composite part and isn't + accessible directly + --> + + <!-- short form of primaryKey{@name, @type} --> + <xsl:template match="m:primaryKey" mode="expand-member"> + <xsl:copy> + <xsl:copy-of select="@*"/> + <m:property special="true"> + <xsl:copy-of select="@*" /> + <xsl:copy-of select="*" /> + </m:property> + </xsl:copy> + </xsl:template> + + <!-- long form of primaryKey{ member{@name}+, property{@name, @type} } --> + <xsl:template match="m:primaryKey[m:member | m:property]" mode="expand-member"> + <xsl:copy> + <xsl:copy-of select="@*"/> + <xsl:apply-templates mode="expand-member"/> + </xsl:copy> + </xsl:template> + + <!-- stand alone properties --> + <xsl:template match="m:property" mode="expand-member"> + <xsl:copy-of select="."/> + </xsl:template> + + <!-- properties declared inside relations, they are @special --> + <xsl:template match="m:primaryKey/m:property | m:thisKey/m:property" mode="expand-member"> + <xsl:copy> + <xsl:attribute name="special">true</xsl:attribute> + <xsl:copy-of select="@*"/> + <xsl:copy-of select="*"/> + </xsl:copy> + </xsl:template> + + <xsl:template match="m:member" mode="expand-member"> + <xsl:param name="declaringType"/> + <xsl:variable name="expanded"> + <xsl:call-template name="getMembers"> + <xsl:with-param name="memberName" select="@name"/> + <xsl:with-param name="type" select="$declaringType"/> + </xsl:call-template> + </xsl:variable> + <!-- recusive expand --> + <xsl:apply-templates select="exsl:node-set($expanded)" mode="expand-member"/> + </xsl:template> + + <xsl:template match="m:hasA" mode="expand-member"> + <xsl:copy> + <xsl:copy-of select="@*"/> + + <xsl:apply-templates mode="expand-member"/> + </xsl:copy> + </xsl:template> + + <xsl:template match="m:thisKey" mode="expand-member"> + <xsl:variable name="otherKey"> + <xsl:call-template name="getPrimaryKey"> + <xsl:with-param name="type" select="../@type"/> + </xsl:call-template> + </xsl:variable> + <xsl:variable name="otherKeyExpanded"> + <xsl:apply-templates select="exsl:node-set($otherKey)" mode="expand-member"/> + </xsl:variable> + <xsl:variable name="pk" select="exsl:node-set($otherKeyExpanded)[1]"/> + + <m:property name="{@name}" type="{$pk/@type}" hidden="true"> + <m:related name="{$pk/@name}" type="{../@type}"/> + </m:property> + </xsl:template> + + <xsl:template match="m:thisKey[m:member | property]"> + <xsl:apply-templates mode="expand-member"/> + </xsl:template> + </xsl:stylesheet>