2013-10-21 75 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瞭解排序的一些例子。如果你無法完成它的工作,最好是問一個整體新問題,現在這個問題已被標記爲已接受,請問更多問題,這很好。謝謝! –