2013-05-21 41 views
0

我有一個XML(銷售訂單)的問題。我用XML結構導入一個文件(csv)。 我使用的工具自動從該文件創建一個具有相同結構的XML。所有標籤都在同一水平上。所有標籤one level,order group and sort in xslt

<?xml version="1.0" encoding="UTF-8"?> 
<ORDER> 
<ENV> 
    <SenderCode>1234</SenderCode> 
    <Test>N</Test> 
</ENV> 
<HDR> 
    <OrderNumber>100</OrderNumber> 
    <OrderDate>201206080000</OrderDate> 
</HDR> 
<ROW> 
    <LineNumber>1</LineNumber> 
    <Article>A</Article> 
</ROW> 
<ROW> 
    <LineNumber>2</LineNumber> 
    <Article>B</Article> 
</ROW> 
<ROW> 
    <LineNumber>3</LineNumber> 
    <Article>C</Article> 
</ROW> 
<ROW> 
    <LineNumber>4</LineNumber> 
    <Article>D</Article> 
</ROW> 
<HDR> 
    <OrderNumber>101</OrderNumber> 
    <OrderDate>201206080000</OrderDate> 
</HDR> 
<ROW> 
    <LineNumber>1</LineNumber> 
    <Article>E</Article> 
</ROW> 
<ROW> 
    <LineNumber>2</LineNumber> 
    <Article>F</Article> 
</ROW> 
</ORDER> 

我需要的輸出是:

<?xml version="1.0" encoding="UTF-8"?> 
<ORDER> 
    <ENV> 
    <SenderCode>1234</SenderCode> 
    <Test>N</Test> 
    </ENV> 
    <HDR> 
    <OrderNumber>100</OrderNumber> 
    <OrderDate>201206080000</OrderDate> 
    <ROW> 
     <LineNumber>1</LineNumber> 
     <Article>A</Article> 
    </ROW> 
    <ROW> 
     <LineNumber>2</LineNumber> 
     <Article>B</Article> 
    </ROW> 
    <ROW> 
     <LineNumber>3</LineNumber> 
     <Article>C</Article> 
    </ROW> 
    <ROW> 
     <LineNumber>4</LineNumber> 
     <Article>D</Article> 
    </ROW> 
    </HDR> 
    <ENV> 
    <SenderCode>1234</SenderCode> 
    <Test>N</Test> 
    </ENV> 
    <HDR> 
    <OrderNumber>101</OrderNumber> 
    <OrderDate>201206080000</OrderDate> 
    <ROW> 
     <LineNumber>1</LineNumber> 
     <Article>E</Article> 
    </ROW> 
    <ROW> 
     <LineNumber>2</LineNumber> 
     <Article>F</Article> 
    </ROW> 
    </HDR> 
</ORDER> 

我怎麼可以這樣使用XSLT?當我嘗試這個時,所有六個ROW標籤都在HDR(1)和HDR(2)之下。

<?xml version="1.0" encoding="UTF-8"?> 
<ORDER> 
<ENV> 
    <SenderCode>1234</SenderCode> 
    <Test>N</Test> 
</ENV> 
<HDR> 
    <OrderNumber>100</OrderNumber> 
    <OrderDate>201206080000</OrderDate> 
    <ROW> 
     <LineNumber>1</LineNumber> 
     <Article>A</Article> 
    </ROW> 
    <ROW> 
     <LineNumber>2</LineNumber> 
     <Article>B</Article> 
    </ROW> 
    <ROW> 
     <LineNumber>3</LineNumber> 
     <Article>C</Article> 
    </ROW> 
    <ROW> 
     <LineNumber>4</LineNumber> 
     <Article>D</Article> 
    </ROW> 
    <ROW> 
     <LineNumber>1</LineNumber> 
     <Article>E</Article> 
    </ROW> 
    <ROW> 
     <LineNumber>2</LineNumber> 
     <Article>F</Article> 
    </ROW> 
</HDR> 
<ENV> 
    <SenderCode>1234</SenderCode> 
    <Test>N</Test> 
</ENV> 
<HDR> 
    <OrderNumber>101</OrderNumber> 
    <OrderDate>201206080000</OrderDate> 
    <ROW> 
     <LineNumber>1</LineNumber> 
     <Article>A</Article> 
    </ROW> 
    <ROW> 
     <LineNumber>2</LineNumber> 
     <Article>B</Article> 
    </ROW> 
    <ROW> 
     <LineNumber>3</LineNumber> 
     <Article>C</Article> 
    </ROW> 
    <ROW> 
     <LineNumber>4</LineNumber> 
     <Article>D</Article> 
    </ROW> 
    <ROW> 
     <LineNumber>1</LineNumber> 
     <Article>E</Article> 
    </ROW> 
    <ROW> 
     <LineNumber>2</LineNumber> 
     <Article>F</Article> 
    </ROW> 
</HDR> 
</ORDER> 

有人能幫助我嗎?

謝謝

+0

另外,也許你可以一個比特的數據添加到您的樣品,因爲它是不明確的「ENV」和「HDR」元素是否爲空或不輸入XML,如果不是,輸出中的數據應該發生什麼。謝謝! –

+0

請顯示您嘗試過的XSLT。 – Borodin

回答

1

這個轉換將做你所問。它使用一個密鑰來標識緊跟在每個HDR之後的所有ROW元素。

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

    <xsl:strip-space elements="*"/> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:key name="row-by-hdr-id" match="ROW" use="generate-id(preceding-sibling::HDR[1])"/> 

    <xsl:template match="node()"> 
    <xsl:copy> 
     <xsl:apply-templates/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/ORDER"> 
    <xsl:copy> 
     <xsl:apply-templates select="HDR"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="HDR"> 
    <xsl:apply-templates select="preceding-sibling::ENV"/> 
    <xsl:copy> 
     <xsl:apply-templates/> 
     <xsl:apply-templates select="key('row-by-hdr-id', generate-id())"/> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

輸出

<?xml version="1.0" encoding="utf-8"?> 
<ORDER> 
    <ENV> 
     <SenderCode>1234</SenderCode> 
     <Test>N</Test> 
    </ENV> 
    <HDR> 
     <OrderNumber>100</OrderNumber> 
     <OrderDate>201206080000</OrderDate> 
     <ROW> 
     <LineNumber>1</LineNumber> 
     <Article>A</Article> 
     </ROW> 
     <ROW> 
     <LineNumber>2</LineNumber> 
     <Article>B</Article> 
     </ROW> 
     <ROW> 
     <LineNumber>3</LineNumber> 
     <Article>C</Article> 
     </ROW> 
     <ROW> 
     <LineNumber>4</LineNumber> 
     <Article>D</Article> 
     </ROW> 
    </HDR> 
    <ENV> 
     <SenderCode>1234</SenderCode> 
     <Test>N</Test> 
    </ENV> 
    <HDR> 
     <OrderNumber>101</OrderNumber> 
     <OrderDate>201206080000</OrderDate> 
     <ROW> 
     <LineNumber>1</LineNumber> 
     <Article>E</Article> 
     </ROW> 
     <ROW> 
     <LineNumber>2</LineNumber> 
     <Article>F</Article> 
     </ROW> 
    </HDR> 
</ORDER> 
相關問題