平坦化XML​​经由SSIS包加载(flattening XML to load via SSIS

2019-10-18 19:13发布

我从Lotus Notes数据库的XML输出。 以下是XML结构:

<Exec>
   <project id='C000253' type='Approved' >
      <DaysInOnHold>39</DaysInOnHold>
      <DaysInCompleted>0</DaysInCompleted>
      <ProjectComplexity type='1280'>Complex</ProjectComplexity>
      <ChangeRequest>
         <OnGoingAmt type='768'>-112</OnGoingAmt>
         <EAmt type='768'>123</EAmt>
      </ChangeRequest>
      <ChangeRequest>
         <ItemNbr type='768'>2</ItemNbr>
         <EAmt type='768'>321</EAmt>
      </ChangeRequest>
      <IncidentalItem>
         <ACost type='768'>0</ACost>
         <Billable type='1280'>Billable</Billable>
      </IncidentalItem>
      <IncidentalItem>
         <ACost type='768'>33</ACost>
         <Billable type='1280'>Billable</Billable>
      </IncidentalItem>
      <MaterialItem>
         <AQty type='768'>1</AQty>
         <ItemNbr type='768'>4</ItemNbr>
      </MaterialItem>
      <MaterialItem>
         <AQty type='768'>0</AQty>
         <ItemNbr type='768'>5</ItemNbr>
      </MaterialItem>
   </project>
   <project id='C110011' type='Not Approved'>
     ...
      ...
   </project>
</Exec>

当我在我的SSIS包加载XML源,它为每列名的,当然这不是非常理想的表。

我想以这样的方式来改变这一点,它给了我有一个项目表的能力,MaterialItem和ChangeRequest表(并随后将有关回到各个项目条目。

将XSLT是一个答案吗? 如果是这样,任何帮助,将不胜感激。

我想我会在什么添加所需的输出应为(似乎所有类型的属性导致的问题)。 如此看来,我需要一个转换,将摆脱所有的属性 - 特别是TYPE =“...”

<Exec>
   <project id='C0001111'>
      <DaysInOnHold>33</DaysInOnHold>
      <DaysInCompleted>0</DaysInCompleted>
      <ProjectComplexity>Complex</ProjectComplexity>
      <ChangeRequest>
         <OnGoingAmt>52</OnGoingAmt>
         <EAmt>123</EAmt>
      </ChangeRequest>
      <ChangeRequest>
         <ItemNbr>2</ItemNbr>
         <EAmt>321</EAmt>
      </ChangeRequest>
      <IncidentalItem>
         <ACost>0</ACost>
         <Billable>Not Billable</Billable>
      </IncidentalItem>
      <IncidentalItem>
         <ACost>33</ACost>
         <Billable>Billable</Billable>
         </IncidentalItem>
      <MaterialItem>
         <AQty>1</AQty>
         <ItemNbr>4</ItemNbr>
      </MaterialItem>
      <MaterialItem>
         <AQty>0</AQty>
         <ItemNbr>5</ItemNbr>
      </MaterialItem>
   </project>
</Exec>

Answer 1:

这是直接的使用XSLT。 首先,你需要在XSLT读了身份转换 ,其自身将复制的所有节点,并在你的XSLT属性不变。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="@*|node()">
      <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
      </xsl:copy>
   </xsl:template>
</xsl:stylesheet>

如果你想删除只需键入属性,但保留其他属性不变,只需添加下面的模板上面的XSLT。 这将匹配类型的属性,但没有一点输出(即它们将被忽略)

<xsl:template match="@type" />

如果您要删除所有属性,只需修改的indentity转换模板,以消除属性相匹配。 例如:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="node()">
    <xsl:copy>
      <xsl:apply-templates select="node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>


文章来源: flattening XML to load via SSIS package