with-param не работает в apply-шаблонах - PullRequest
0 голосов
/ 14 сентября 2009

В настоящее время я пытаюсь сгенерировать SQL создания для моих таблиц на основе диаграммы Visio. Я делаю это, используя подход, найденный здесь.

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 Ответ

2 голосов
/ 14 сентября 2009

Параметр не игнорируется, но, думаю, он пуст. Звоните:

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

где @PhysicalName должен быть атрибутом EntityAttributes/EntityAttribute элемента for-each. Тот факт, что вы используете @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 сбрасывает узел контекста при каждой итерации, я думаю, это то, что вам не подходит

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...