with-param无法在apply-templates中使用

时间:2009-09-14 16:18:32

标签: xslt

我目前正在尝试基于Visio图为我的表生成创建SQL。我是用这里找到的方法做的。

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>

1 个答案:

答案 0 :(得分:2)

该参数不会被忽略,但我猜它是空的。你打电话:

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

其中@PhysicalName必须是for-each中EntityAttributes/EntityAttribute元素的属性。您之前在

中使用@PhysicalName这一事实
CREATE TABLE dbo.[<xsl:value-of select="@PhysicalName"/>]

让我认为它实际上是模板匹配的Entity元素的属性。您需要先将其值存储在变量中(在for-each之前):

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

然后像这样使用它:

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

for-each会在每次迭代时重置上下文节点,我想这就是你出错的地方。