After introducing the XML format of Entity Framework’s edmx files, let’s use that knowledge to create a small XSLT style sheet which displays the mappings of tables and entities in a Wiki-style table (which can be used in MediaWiki and SharePoint wikis).
In the XSLT root, we need to declare all namespaces used by the edmx to access nodes and attributes:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/ EntityStoreSchemaGenerator" xmlns:ssdl="http://schemas.microsoft.com/ado/2006/04/edm/ssdl" xmlns:cs="urn:schemas-microsoft-com:windows:storage:mapping:CS" xmlns:edm="http://schemas.microsoft.com/ado/2006/04/edm" xmlns:a="http://schemas.microsoft.com/ado/2006/04/codegeneration" xml:space="default" > <xsl:output method="html" omit-xml-declaration="yes" /> <!-- input file is C:\path\to\Model.edmx -->
This XSLT does not start with the mappings section, but with the tables and views inside the Schema definition, and then looks up their Mappings definition:
<xsl:template match="/"> <xsl:apply-templates select="edmx:Edmx/edmx:Runtime/edmx:StorageModels/ssdl:Schema" /> </xsl:template> <xsl:template match="ssdl:Schema"> <html> <body> <table width="100%"> <xsl:apply-templates select="ssdl:EntityType" > <xsl:with-param name="namespace" select="@Namespace" /> </xsl:apply-templates> </table> </body> </html> </xsl:template>
This code creates a table row for each database table and its class:
<xsl:template match="ssdl:EntityType" > <xsl:param name="namespace"></xsl:param> <xsl:variable name="table" select="@Name" ></xsl:variable> <xsl:variable name="map" select="/edmx:Edmx/edmx:Runtime/edmx:Mappings/cs:Mapping/ cs:EntityContainerMapping/ cs:EntitySetMapping[cs:EntityTypeMapping/ cs:MappingFragment/@StoreEntitySet=$table]" /> <xsl:variable name="s" select="$map/*/@TypeName" /> <xsl:variable name="p" select="concat('IsTypeOf(', substring($namespace, 1, string-length($namespace) - 5))" /> <xsl:variable name="class" select="substring($s, string-length($p) + 1, string-length($s) - string-length($p) - 1)"> </xsl:variable> <tr valign="top"> <td > [[<xsl:value-of select="@Name"/>]] </td> <td> <xsl:value-of select="$class" /> </td> </tr> </xsl:template> </xsl:stylesheet>
The [[ ]] notation creates a wiki hyperlink that allows developers to document tables and entities, and link to other documentation.
Pingback: Generating Documentation of Entity Framework edmx Files « devioblog
Thanks, this was extremely useful to me!