BIML 注释标签不匹配

BIML Annotation Tag not matching

我正在将 table 中的架构转储到包的标记注释中。

        <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#>">

标签被放入包名称中,但它周围填充了很多 space。

<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 关闭 space。我尝试将 trim() 放在不同的位置,但 BIML 引擎对此表示不满。通过将 BIML 中实际注释前面的制表符移出,我能够摆脱领先的 spaces,但它仍然填充末尾。

关于标签为何被填充的任何想法,或者也许我在这里完全偏离基地,而不是标签周围的 spaces。

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

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

如果将该定义更改为以下内容,是否一切正常 "magically"?

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

我这么认为是因为我 运行 遇到了与包参数类似的问题...

这是 "rock and a hard place" 情况之一。在更早的版本中,我们实际上自动 trimmed 注释标记值来删除前导和尾随空格。这会在用户真正需要该空白的情况下给用户带来问题。

对此有一些解决方法:

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

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