2014-01-14 58 views
1

輸入xml包含不同裝運的多個重複記錄。 記錄1,2和3屬於一次裝運,記錄1,2和3屬於另一批貨物。 輸出應該像輸出xml。每批貨物都被轉換爲Root-Element根據起始元素對兄弟組進行分組

輸入:

<?xml version = '1.0' encoding = 'UTF-8'?> 
    <Root-Element> 

      <RECORD1> 
      <C2>500000000222725718846C </C2> 
      <C3>3014 </C3> 
      <C4> DELVRY02 </C4> 
      </RECORD1> 
      <RECORD2> 
      <C2> 50000000022272571880</C2> 
      <C3>000010000000200</C3> 
      <C4>9659666341109001 </C4> 
      </RECORD2> 
      <RECORD3> 
      <C2> 50000000022272</C2> 
      <C3>5718800000</C3> 
      <C4>200000103002</C4> 
      </RECORD3> 


     <RECORD1> 
      <C2>5000000002227ABCD </C2> 
      <C3>3014 </C3> 
      <C4> DELVRY02 </C4> 
      </RECORD1> 
      <RECORD2> 
      <C2> 50000000022272571880</C2> 
      <C3>000010000000200</C3> 
      <C4>9659666341109001 </C4> 
      </RECORD2> 
      <RECORD3> 
      <C2> 50000000022272</C2> 
      <C3>5718800000</C3> 
      <C4>200000103002</C4> 
      </RECORD3> 

    </Root-Element> 

輸出:

<?xml version="1.0"?> 
<Root-Element> 
<shipment> 
<RECORD1> 
<C2>500000000222725718846C </C2> 
<C3>3014 </C3> 
<C4> DELVRY02 </C4> 
</RECORD1> 
<RECORD2> 
<C2> 50000000022272571880</C2> 
<C3>000010000000200</C3> 
<C4>9659666341109001 </C4> 
</RECORD2> 
<RECORD3> 
<C2> 50000000022272</C2> 
<C3>5718800000</C3> 
<C4>200000103002</C4> 
</RECORD3> 
</shipment> 
<shipment> 
<RECORD1> 
<C2>5000000002227ABCD </C2> 
<C3>3014 </C3> 
<C4> DELVRY02 </C4> 
</RECORD1> 
<RECORD2> 
<C2> 50000000022272571880</C2> 
<C3>000010000000200</C3> 
<C4>9659666341109001 </C4> 
</RECORD2> 
<RECORD3> 
<C2> 50000000022272</C2> 
<C3>5718800000</C3> 
<C4>200000103002</C4> 
</RECORD3> 
</shipment> 
</Root-Element> 

我想這下面XSLT,但它給一個問題。

XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:key name="items" match="Root-Element/*" 
      use="generate-id(preceding-sibling::RECORD1[1])"/> 
    <xsl:template match="/Root-Element"> 
    <Root-Element> 
     <xsl:apply-templates select="@*"/> 
     <xsl:apply-templates select="RECORD1"/> 
    </Root-Element> 
    </xsl:template> 
    <xsl:template match="RECORD1"> 
    <shipment> 
     <xsl:copy-of select="."/> 
     <xsl:copy-of select="key('items', generate-id())"/> 
    </shipment> 
    </xsl:template> 

</xsl:stylesheet> 

輸出與上面的XSLT越來越:

<?xml version="1.0"?> 
<Root-Element> 
<shipment> 
<RECORD1> 
<C2>500000000222725718846C </C2> 
<C3>3014 </C3> 
<C4> DELVRY02 </C4> 
</RECORD1> 
<RECORD2> 
<C2> 50000000022272571880</C2> 
<C3>000010000000200</C3> 
<C4>9659666341109001 </C4> 
</RECORD2> 
<RECORD3> 
<C2> 50000000022272</C2> 
<C3>5718800000</C3> 
<C4>200000103002</C4> 
</RECORD3> 
<RECORD1><!-- it should not come....This is the issue --> 
<C2>5000000002227ABCD </C2> 
<C3>3014 </C3> 
<C4> DELVRY02 </C4> 
</RECORD1> 
</shipment> 
<shipment> 
<RECORD1> 
<C2>5000000002227ABCD </C2> 
<C3>3014 </C3> 
<C4> DELVRY02 </C4> 
</RECORD1> 
<RECORD2> 
<C2> 50000000022272571880</C2> 
<C3>000010000000200</C3> 
<C4>9659666341109001 </C4> 
</RECORD2> 
<RECORD3> 
<C2> 50000000022272</C2> 
<C3>5718800000</C3> 
<C4>200000103002</C4> 
</RECORD3> 
</shipment> 
</Root-Element> 
+0

我編輯了你的標題和你的一些文本,因爲它的公式化方式你的問題乍一看就像它問如何創建一些無效的XML。 (現在的2個關閉投票可能是由於這一點。) – Louis

回答

0

我相信這你想要做什麼:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:key name="items" match="Root-Element/*[name() != 'RECORD1']" 
      use="preceding-sibling::RECORD1[1]"/> 
    <xsl:template match="/Root-Element"> 
    <Root-Element> 
     <xsl:apply-templates select="@*"/> 
     <xsl:apply-templates select="RECORD1"/> 
    </Root-Element> 
    </xsl:template> 
    <xsl:template match="RECORD1"> 
    <shipment> 
     <xsl:copy-of select="."/> 
     <xsl:copy-of select="key('items', .)"/> 
    </shipment> 
    </xsl:template> 
</xsl:stylesheet> 

我和xsltproc的測試,並撒克遜人。密鑰不需要generate-id。您使用的代碼的一個主要問題是密鑰在具有相同密鑰的元素組中包含RECORD1。由於它們是通過查看前面的RECORD1元素進行分組的,因此任何給定的RECORD1元素都會最終與之前的組分組。解決方案是排除它。

+0

代碼不適合我,因爲我認爲我使用的是oracle xslt processer,而不是撒克遜。 – user3192924

+0

您是否嘗試重新引入''generate-id''? xsltproc和saxon都不需要它,但也許Oracle處理器需要它。 – Louis

+0

是的,我嘗試過,但那時它給予了不同的輸出。 – user3192924