2013-03-22 77 views
-1

行數據我有多個行元素的數據在我這樣的XML -在XSL 1.0

<ROW TYPE="SPECIFICATION" ID="1"> 
    <R1>English1</R1> 
</ROW> 
<ROW TYPE="SPECIFICATION" ID="1"> 
    <R1>Maths1</R1> 
</ROW> 
<ROW TYPE="TOTAL" ID="1"> 
    <R1>Code1</R1> 
</ROW> 
<ROW TYPE="SPECIFICATION" ID="2"> 
    <R1>English2</R1> 
</ROW> 
<ROW TYPE="SPECIFICATION" ID="2"> 
    <R1>Maths2</R1> 
</ROW> 
<ROW TYPE="TOTAL" ID="2"> 
    <R1>Code2</R1> 
</ROW> 
<ROW TYPE="MAIN" ID="3"> 
    <R1>Code3</R1> 
</ROW> 
<ROW TYPE="SPECIFICATION" ID="4"> 
    <R1>English4</R1> 
</ROW> 
<ROW TYPE="TOTAL" ID="4"> 
    <R1>Code4</R1> 
</ROW> 

我要顯示在圖像輸出我喜歡這行數據在for-each循環工作。並且要求首先顯示ROW TYPE =「TOTAL」ID =「1」,然後顯示其ROW TYPE =「SPECIFICATION」數據。再次進入循環,應先顯示ROW TYPE =「TOTAL」ID =「2」,然後顯示其ROW TYPE =「SPECIFICATION」數據。如果ROW_TYPE不同(可以是任何東西),那麼它應該按順序出現。它僅限於SPECIFICATION和TOTAL。

基本上,它也應該是這樣 -

Code1 
    English1 
    Maths1 
Code2 
    English2 
    Maths2 
Code3 
Code4 
    English4 

的XSLT代碼適用於序列for-each循環的作品。但是我需要先爲該ID移動TOTAL行。請爲此提出邏輯。

+0

這不是一個http://stackoverflow.com/questions/15539332/shifting-row-data-in-xsl-1-0重複? – 2013-03-22 04:27:28

+0

如果你看到,這個XML有一個小的改變。此前的邏輯是針對2種ROW數據的。現在數據是變化的。 – Kundan 2013-03-22 04:28:42

+0

所以如果你有''ROW TYPE =「SPECIFICATION」/>''(爲了簡潔起見我省略了R1)在結果? – JLRishe 2013-03-22 04:54:18

回答

0

該轉化

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 
<xsl:key name="kRowById" 
     match="ROW[not(@TYPE='TOTAL' or @TYPE='MAIN')]" 
     use="@ID"/> 

<xsl:template match="ROW[@TYPE='TOTAL' or @TYPE='MAIN']"> 
    <xsl:copy-of select="."/> 
    <xsl:copy-of select="key('kRowById', @ID)"/> 
</xsl:template> 
<xsl:template match="text()"/> 
</xsl:stylesheet> 

當在XML文檔施加(從所提供的XML片段產生,由包成一個單一的頂部元件):

<t> 
    <ROW TYPE="SPECIFICATION" ID="1"> 
     <R1>English1</R1> 
    </ROW> 
    <ROW TYPE="SPECIFICATION" ID="1"> 
     <R1>Maths1</R1> 
    </ROW> 
    <ROW TYPE="TOTAL" ID="1"> 
     <R1>Code1</R1> 
    </ROW> 
    <ROW TYPE="SPECIFICATION" ID="2"> 
     <R1>English2</R1> 
    </ROW> 
    <ROW TYPE="SPECIFICATION" ID="2"> 
     <R1>Maths2</R1> 
    </ROW> 
    <ROW TYPE="TOTAL" ID="2"> 
     <R1>Code2</R1> 
    </ROW> 
    <ROW TYPE="MAIN" ID="3"> 
     <R1>Code3</R1> 
    </ROW> 
    <ROW TYPE="SPECIFICATION" ID="4"> 
     <R1>English4</R1> 
    </ROW> 
    <ROW TYPE="TOTAL" ID="4"> 
     <R1>Code4</R1> 
    </ROW> 
</t> 

產生想要的,正確的結果:

<ROW TYPE="TOTAL" ID="1"> 
    <R1>Code1</R1> 
</ROW> 
<ROW TYPE="SPECIFICATION" ID="1"> 
    <R1>English1</R1> 
</ROW> 
<ROW TYPE="SPECIFICATION" ID="1"> 
    <R1>Maths1</R1> 
</ROW> 
<ROW TYPE="TOTAL" ID="2"> 
    <R1>Code2</R1> 
</ROW> 
<ROW TYPE="SPECIFICATION" ID="2"> 
    <R1>English2</R1> 
</ROW> 
<ROW TYPE="SPECIFICATION" ID="2"> 
    <R1>Maths2</R1> 
</ROW> 
<ROW TYPE="MAIN" ID="3"> 
    <R1>Code3</R1> 
</ROW> 
<ROW TYPE="TOTAL" ID="4"> 
    <R1>Code4</R1> 
</ROW> 
<ROW TYPE="SPECIFICATION" ID="4"> 
    <R1>English4</R1> 
</ROW> 

更新

按照由在註釋中OP請求時,如果從「規範」不同的任意值必須被放置在該組的頭上,使用以下代碼:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 
<xsl:key name="kRowById" 
     match="ROW[not(@TYPE='TOTAL' or @TYPE='MAIN')]" 
     use="@ID"/> 

<xsl:template match="ROW[not(@TYPE='SPECIFICATION')]"> 
    <xsl:copy-of select="."/> 
    <xsl:copy-of select="key('kRowById', @ID)"/> 
</xsl:template> 
<xsl:template match="text()"/> 
</xsl:stylesheet> 
+0

有關ROW_TYPE是否包含值的任何建議,該值可以是任何未知的數據或輸入文件中包含的數據。 – Kundan 2013-03-22 05:10:42

+0

@Kundan,如果沒有指定在這種情況下必須完成的工作,則不能有任何建議...... – 2013-03-22 05:13:18

+0

是否意味着如果我們不知道ROW_TYPE中客戶端發來的數據是什麼,那麼我們無法顯示數據就像我們現在正在做的那樣。應該始終知道ROW_TYPE? – Kundan 2013-03-22 05:16:18