我有Lotus Notes DB的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源时,它会为每个列名创建一个表,这当然不是很理想。
我希望以这样的方式对其进行转换,使其能够拥有Project表,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>
答案 0 :(得分: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>