2009-09-14 75 views
0

我目前正在嘗試基於Visio圖生成我的表的創建SQL。我正在使用這裏找到的方法來做這件事。與-param不工作在應用模板

http://www.dougboude.com/blog/1/2008/11/SQL-Forward-Engineering-with-Visio-2003-Professional.cfm

我試圖修改XSLT文件中發現有更好地模式,我們在我們的辦公室中使用的語法。不幸的是,我無法得到涉及將表格名稱傳遞到模板中以使表格列工作的部分。該模板被調用,但它似乎忽略了我的參數。

<xsl:template match="Entity" mode="table"> 
IF NOT EXISTS (SELECT * FROM sysobjects WHERE name = '<xsl:value-of select="@PhysicalName"/>') 
<br /> 
CREATE TABLE dbo.[<xsl:value-of select="@PhysicalName"/>] 
(
<br /> 
<xsl:for-each select="EntityAttributes/EntityAttribute"> 
    <span style="padding-left: 20px;"> 
     <xsl:apply-templates select="../../../../Attributes/Attribute[@AttributeID = current()/@EntityAttributeID]" mode="table"> 
      <xsl:with-param name="EntityName" select="@PhysicalName" /> 
     </xsl:apply-templates> 
    </span> 
    <xsl:if test="count(../../EntityAttributes/EntityAttribute) != position()">,</xsl:if> 
    <br /> 
</xsl:for-each> 
) 
<br /> 
GO 
<p /> 

<xsl:apply-templates select="EntityAnnotations/EntityAnnotation[@AnnotationType='Primary Key']" mode="pk"/> 
<xsl:apply-templates select="EntityAnnotations/EntityAnnotation[@AnnotationType='Alternate Key']" mode="ak"/> 
<xsl:apply-templates select="EntityAnnotations/EntityAnnotation[@AnnotationType='Index']" mode="idx"/> 
</xsl:template> 

<!-- Create column for each EntityAttribute --> 
<xsl:template match="Attribute" mode="table"> 
    <xsl:param name="EntityName"></xsl:param> 
    <xsl:variable name="nullability"> 
     <xsl:choose> 
      <xsl:when test='@AllowNulls = "false"'>NOT NULL CONSTRAINT DF_<xsl:value-of select="$EntityName" />_<xsl:value-of select="@PhysicalName"/> 
     </xsl:when> 
      <xsl:otherwise> NULL</xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 
    <xsl:variable name="incremental"> 
     <xsl:choose> 
      <xsl:when test='@PhysicalDatatype = "int identity"'> INT IDENTITY(1,1)</xsl:when> 
      <xsl:otherwise><xsl:value-of select="@PhysicalDatatype"/></xsl:otherwise> 
     </xsl:choose> 
    </xsl:variable> 

[<xsl:value-of select="@PhysicalName"/>] <span style="text-transform:uppercase;"> <xsl:value-of select="$incremental"/></span> <xsl:value-of select="$nullability"/> 

</xsl:template> 

回答

2

參數不會被忽略,但我猜它是空的。您致電:

<xsl:with-param name="EntityName" select="@PhysicalName" /> 

其中@PhysicalName必須從換每個EntityAttributes/EntityAttribute元素的屬性。您在

CREATE TABLE dbo.[<xsl:value-of select="@PhysicalName"/>] 

使用@PhysicalName較早的事實讓我覺得在現實中卻是Entity元素的模板相匹配的屬性。首先,您需要保存它以一個變量值(之前的for-each):

<xsl:variable name="PhysicalName" select="@PhysicalName" /> 

,然後用它是這樣的:

<xsl:with-param name="EntityName" select="$PhysicalName" /> 
<!-- -------------------------------------^ --> 

的換每個復位與每次迭代上下文節點,我猜這是你的錯。