SSIS:如何在脚本块中聚合父子?

时间:2014-09-03 14:17:28

标签: .net xml ssis

我有一个我在SSIS中导入的XML源。

这是一个片段:

  <pmd:TAG>
    <pmd:Folder>Something</pmd:Folder>
    <pmd:Index>Index1</pmd:Index>
    <pmd:Index>Index2</pmd:Index>
    <pmd:Index>Index3</pmd:Index>
    <pmd:Index>Index4</pmd:Index>
  </pmd:TAG>

不要让我开始关于XSD ......但我必须处理它并且它不会改变。我想要做的是有一个脚本标记,它将调用:

SomeClass.DoSomething("Something", "Index1", "Index2", "Index3", "Index4");

我创建了这个类,它在GAC中。

如果我从XML源创建脚本块,我可以选择TAG元素作为输入,如果我编辑脚本并检查Row实例,则只允许访问Folder值。

我可以为脚本选择另一个输入,称为TAG_Index,它具有TAG_Id和索引值。

理想情况下,我会做类似的事情:

var indexes = Row.Indexes.ToArray();
SomeClass.DoSomething(Row.Folder, indexes)

indices参数有param - 所以数组会这样做。

重点是 - 如何从父母那里获取TAG'子'项?

我尝试了一个联盟 - 但这会给我一个结果集,如:

+------------+--------+
|   Folder   | Value  |
+------------+--------+
| Something  | Index1 |
| Something  | Index2 |
| Something  | Index3 |
| Something  | Index4 |
+------------+--------+

我无法使用脚本块导入。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我们通过使用XML任务和XSLT转换数据来解决此问题。之前:

<Tag>
  <Folder>Whatever</Folder>
  <Index>2014-03-31</Index>
  <Index>31454534</Index>
  <Index>3274</Index>
  <Index>Testname1 Testname2</Index>
</Tag>

后:

<Tags>
  <Tag Folder="Whatever" Index1="2014-03-31" Index2="31454534" Index3="3274" Index4="Testname1 Testname2" />
</Tags>

XSLT在下面(我摆脱了所有的名字和东西,所以这不是一个有效的例子)。我们从XML任务运行转换(如下所述:http://blogs.msdn.com/b/mattm/archive/2007/12/15/xml-source-making-things-easier-with-xslt.aspx)。我们将结果保存到变量中。然后我们使用XML源运行数据流任务,该XML源从变量加载XML。然后出现所有行。然后我们使用它作为我们可以访问的脚本组件的输入:Row.Folder,Row.Index1 ......等。

<强> XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:pmd="http://something"
                xmlns:default="http://something"
                xmlns:k="http://something"
                exclude-result-prefixes="msxsl"
>
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <k:TagList>
      <k:Tags>
        <xsl:apply-templates/>
      </k:Tags>
    </k:TagList>
  </xsl:template>

  <xsl:template match="default:Metadata">
    <xsl:apply-templates/>
  </xsl:template>

  <xsl:template match="pmd:Tag">
    <k:Tag>
      <xsl:attribute name="Folder">
        <xsl:value-of select="pmd:Folder" />
      </xsl:attribute>
      <xsl:attribute name="Index1">
        <xsl:value-of select="pmd:Index[1]" />
      </xsl:attribute>
      <xsl:attribute name="Index2">
        <xsl:value-of select="pmd:Index[2]" />
      </xsl:attribute>
      <xsl:attribute name="Index3">
        <xsl:value-of select="pmd:Index[3]" />
      </xsl:attribute>
      <xsl:attribute name="Index4">
        <xsl:value-of select="pmd:Index[4]" />
      </xsl:attribute>
    </k:Tag>
  </xsl:template>