1

我将表中的模式转储到包的标记注释中。

        <Annotation AnnotationType="Tag" Tag="PackageSchema">
            <#=Table.Schema#>
        </Annotation>

在用于创建主包的 BIML 中,我正在为每个模式创建一个序列容器并将包放入相应的容器中。至少这是我要求它做的。

<Package Name="01-Master" ConstraintMode="Linear">
    <Tasks>
        <# foreach (var SchemaNode in RootNode.Schemas) { #>
            <Container Name="SEQC <#=SchemaNode.Name#>" ConstraintMode = "Parallel">
                <Tasks>
                    <# foreach (var Pckg in RootNode.Packages.Where(pkgschema => pkgschema.GetTag("PackageSchema")==SchemaNode.Name)) { #>
                        <ExecutePackage Name="EP <#=Pckg.Name#>" DelayValidation="true">
                            <ExternalProjectPackage Package="<#=Pckg.Name#>.dtsx">
                            </ExternalProjectPackage>
                        </ExecutePackage>
                    <# } #>
                </Tasks>
            </Container>
        <# } #>
    </Tasks>

当它运行时,我得到一个带有空序列容器的主包。我从包 foreach 中取出 where,它生成但将所有包放入每个容器中。我将 GetTag 放在包裹的名称中只是为了确保它正确地拾取它。

<# foreach (var Pckg in RootNode.Packages) { #>
    <ExecutePackage Name="EP <#=Pckg.Name#>" DelayValidation="true">
        <ExternalProjectPackage Package="<#=Pckg.Name#>.dtsx--<#=Pckg.GetTag("PackageSchema")#>--<#=SchemaNode.Name#>">

标签被放入包名中,但它周围有很多空间。

<ExecutePackage Name="EP Application_TransactionTypes" DelayValidation="true">
    <ExternalProjectPackage Package="Application_TransactionTypes.dtsx--                 Application             --Application" />
</ExecutePackage>
<ExecutePackage Name="EP Purchasing_PurchaseOrderLines" DelayValidation="true">
    <ExternalProjectPackage Package="Purchasing_PurchaseOrderLines.dtsx--                 Purchasing             --Application" />
</ExecutePackage>

所以我猜测填充值是 RootNode.Packages.Where 与模式名称不匹配的原因。我不知道如何修剪空间。我尝试将 trim() 放在不同的地方,但 BIML 引擎抱怨它。通过在 BIML 中的实际注释前面取出制表符,我能够摆脱前导空格,但它仍然填充结尾。

关于为什么要填充标签的任何想法,或者我可能完全不在此处,而不是标签周围的空格。

4

2 回答 2

2

这是那些“艰难而艰难”的情况之一。在更早的版本中,我们实际上自动修剪注释标记值以删除前导和尾随空格。在用户真正需要该空格的情况下,这会给用户带来问题。

有一些解决方法:

  1. 正如比尔指出的那样,只需删除 BimlScript 中的空格。
  2. 如果您确实希望 BimlScript 中的空格具有可读性,请将值包装在 CDATA 块中,以便忽略 CDATA 块之外的换行符。其语法为:
<Annotation AnnotationType="Tag" Tag="PackageSchema">
    <![CDATA[<#=table.Schema#>]]>
</Annotation>
  1. 或者,如果您想保留空白以提高可读性并且不喜欢 CDATA,您可以在使用点从注释值中修剪空白。其语法为:

<#=Pckg.GetTag("PackageSchema").Trim()#>

于 2017-02-22T16:02:04.730 回答
1

这是 Biml/XML 格式在背后咬你的丑陋地方之一

    <Annotation AnnotationType="Tag" Tag="PackageSchema">
        <#=Table.Schema#>
    </Annotation>

如果您将该定义更改为以下内容,那么一切都“神奇地”起作用吗?

    <Annotation AnnotationType="Tag" Tag="PackageSchema"><#=Table.Schema#></Annotation>

我假设是因为我遇到了与包参数类似的问题......

于 2017-02-21T19:00:51.477 回答