2013-10-21 48 views
1

我有一个来自Lotus Notes DB的XML输出。以下是XML结构:展平XML以通过SSIS包加载

<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是如果是这样,任何帮助将不胜感激

我想我会添加什么样的期望的输出应该是(似乎所有的类型属性导致的问题)所以,似乎我需要一个变换将摆脱所有的属性 - 具体是类型=“...”

<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> 
+0

XSLT确实可能的答案在这里,如果你想将XML转换成不同的结构。但首先你需要知道你需要什么样的结构。如果您已经知道需要转换的内容,您可以编辑您的问题以显示您期望输出的XML样本吗?谢谢! –

回答

3

这对XSLT来说很简单。首先,您需要阅读XSLT identity transform,它自己将按原样复制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> 
+0

嗯,一切都很好,除了我还有一个问题。似乎有时子元素,即ChangeRequest或IncidentalItem可能会混乱,而不是按顺序。元素的顺序可能是ChangeRequest,ChangeRequest,IncidentalItem,ChangeRequest <---如果发生这种情况,那么我的SSIS包中有一个问题。有没有一种方法可以根据内部子元素的名称来排序内部子元素?所以我有一致性? – Sash

+1

是的。您将有一个模板来匹配** project **元素,然后在指定的** xsl:sort **参数(在“local-name()”上排序)的子元素上调用** xsl:apply-templates **。 。查看http://www.xml.com/pub/a/2002/07/03/transform.html了解排序的一些例子。如果你无法完成它的工作,最好是问一个整体新问题,现在这个问题已被标记为已接受,请问更多问题,这很好。谢谢! –