2013-04-04 43 views
1

我有一個XSLT問題,它跟隨我之前詢問的問題。提取同一數據中的第一組數據<root>

挑戰是從同一個<root>的重複集合中提取數據集。我從@Kirill Polishchuk提供的上一個問題中獲得了示例XSLT解決方案。

Extracting a class from the section attribute using xsl

我只需要提取第一組數據,而忽視了第二組開始數=「1」

請注意,我用XSLT 1.0工作。任何建議或指導將非常感激。

輸入:

<root> 
    <page number="1" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="2" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="3" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="4" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="5" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="6" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="7" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="8" section="Arsenal_Crowds">Arsenal_Crowds</page> 
    <page number="9" section="Arsenal_Crowds">Arsenal_Crowds</page> 
    <page number="10" section="Arsenal_Crowds">Arsenal_Crowds</page> 
    <page number="11" section="Arsenal_Crowds">Arsenal_Crowds</page> 
    <page number="12" section="Arsenal_Crowds">Arsenal_Crowds</page> 
    <page number="13" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="14" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="15" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="16" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="17" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="18" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="19" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="20" section="Arsenal_Outlook">Arsenal_Outlook</page> 
    <page number="21" section="Arsenal_Outlook">Arsenal_Outlook</page> 
    <page number="22" section="Arsenal_Outlook">Arsenal_Outlook</page> 
    <page number="23" section="Arsenal_Outlook">Arsenal_Outlook</page> 
    <page number="24" section="Arsenal_Outlook">Arsenal_Outlook</page> 
    <page number="1" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="2" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="3" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="4" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="5" section="Arsenal_Crowds">Arsenal_Crowds</page> 
    <page number="6" section="Arsenal_Crowds">Arsenal_Crowds</page> 
    <page number="7" section="Arsenal_Crowds">Arsenal_Crowds</page> 
    <page number="8" section="Arsenal_Crowds">Arsenal_Crowds</page> 
    <page number="9" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="10" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="11" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="12" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="13" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="14" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="15" section="Arsenal_Outlook">Arsenal_Outlook</page> 
    <page number="16" section="Arsenal_Outlook">Arsenal_Outlook</page> 
    <page number="17" section="Arsenal_Outlook">Arsenal_Outlook</page> 
    <page number="18" section="Arsenal_Outlook">Arsenal_Outlook</page> 
</root> 

所需的輸出:

<table> 
<tr> 
<td class="Stadium">Arsenal_Stadium</td> 
<td></td> 
<td class="Crowds">Arsenal_Crowds</td> 
<td></td> 
<td class="Finances">Arsenal_Finances</td> 
<td></td> 
<td class="Outlook">Arsenal_Outlook</td> 
<td></td> 
</tr> 
<tr> 
<td>1</td> 
<td>7</td> 
<td>8</td> 
<td>12</td> 
<td>13</td> 
<td>19</td> 
<td>20</td> 
<td>24</td> 
</tr> 
</table> 

回答

1

該轉化

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> 

    <xsl:key name="k" use="@section" match= 
    "page[(@number > 1 and count(preceding-sibling::*[@number=1]) = 1) 
     or 
     (@number=1 and count(preceding-sibling::*[@number=1]) =0) 
     ]"/> 

    <xsl:template match="/*"> 
    <table> 
     <tr> 
     <xsl:apply-templates select= 
      "page[generate-id() = generate-id(key('k', @section))]"/> 
     </tr> 
     <tr> 
     <xsl:apply-templates mode="page" 
      select="page[generate-id() = generate-id(key('k', @section))]" /> 
     </tr> 
    </table> 
    </xsl:template> 

    <xsl:template match="page"> 
    <td class="{substring-after(@section, '_')}"><xsl:value-of select="."/></td> 
    <td></td> 
    </xsl:template> 

    <xsl:template match="page" mode="page"> 
    <td><xsl:value-of select="@number"/></td> 
    <td><xsl:value-of select="key('k', @section)[last()]/@number"/></td> 
    </xsl:template> 
</xsl:stylesheet> 

當所提供的XML文檔應用:

<root> 
    <page number="1" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="2" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="3" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="4" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="5" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="6" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="7" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="8" section="Arsenal_Crowds">Arsenal_Crowds</page> 
    <page number="9" section="Arsenal_Crowds">Arsenal_Crowds</page> 
    <page number="10" section="Arsenal_Crowds">Arsenal_Crowds</page> 
    <page number="11" section="Arsenal_Crowds">Arsenal_Crowds</page> 
    <page number="12" section="Arsenal_Crowds">Arsenal_Crowds</page> 
    <page number="13" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="14" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="15" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="16" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="17" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="18" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="19" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="20" section="Arsenal_Outlook">Arsenal_Outlook</page> 
    <page number="21" section="Arsenal_Outlook">Arsenal_Outlook</page> 
    <page number="22" section="Arsenal_Outlook">Arsenal_Outlook</page> 
    <page number="23" section="Arsenal_Outlook">Arsenal_Outlook</page> 
    <page number="24" section="Arsenal_Outlook">Arsenal_Outlook</page> 
    <page number="1" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="2" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="3" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="4" section="Arsenal_Stadium">Arsenal_Stadium</page> 
    <page number="5" section="Arsenal_Crowds">Arsenal_Crowds</page> 
    <page number="6" section="Arsenal_Crowds">Arsenal_Crowds</page> 
    <page number="7" section="Arsenal_Crowds">Arsenal_Crowds</page> 
    <page number="8" section="Arsenal_Crowds">Arsenal_Crowds</page> 
    <page number="9" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="10" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="11" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="12" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="13" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="14" section="Arsenal_Finances">Arsenal_Finances</page> 
    <page number="15" section="Arsenal_Outlook">Arsenal_Outlook</page> 
    <page number="16" section="Arsenal_Outlook">Arsenal_Outlook</page> 
    <page number="17" section="Arsenal_Outlook">Arsenal_Outlook</page> 
    <page number="18" section="Arsenal_Outlook">Arsenal_Outlook</page> 
</root> 

產生想要的,正確的結果

<table> 
    <tr> 
     <td class="Stadium">Arsenal_Stadium</td> 
     <td/> 
     <td class="Crowds">Arsenal_Crowds</td> 
     <td/> 
     <td class="Finances">Arsenal_Finances</td> 
     <td/> 
     <td class="Outlook">Arsenal_Outlook</td> 
     <td/> 
    </tr> 
    <tr> 
     <td>1</td> 
     <td>7</td> 
     <td>8</td> 
     <td>12</td> 
     <td>13</td> 
     <td>19</td> 
     <td>20</td> 
     <td>24</td> 
    </tr> 
</table> 

泛化

很容易爲了處理第k「設置爲推廣這一轉變。

例如,下面的變換處理第二相同的「集合」,提供的XML(上圖)文獻:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> 

    <xsl:key name="k" use="@section" match= 
    "page[(@number > 1 and count(preceding-sibling::*[@number=1]) = 2) 
     or 
     (@number=1 and count(preceding-sibling::*[@number=1]) =1) 
     ]"/> 

    <xsl:template match="/*"> 
    <table> 
     <tr> 
     <xsl:apply-templates select= 
      "page[generate-id() = generate-id(key('k', @section))]"/> 
     </tr> 
     <tr> 
     <xsl:apply-templates mode="page" 
      select="page[generate-id() = generate-id(key('k', @section))]" /> 
     </tr> 
    </table> 
    </xsl:template> 

    <xsl:template match="page"> 
    <td class="{substring-after(@section, '_')}"><xsl:value-of select="."/></td> 
    <td></td> 
    </xsl:template> 

    <xsl:template match="page" mode="page"> 
    <td><xsl:value-of select="@number"/></td> 
    <td><xsl:value-of select="key('k', @section)[last()]/@number"/></td> 
    </xsl:template> 
</xsl:stylesheet> 

並再次在這種情況下有用,正確的結果產生:

<table> 
    <tr> 
     <td class="Stadium">Arsenal_Stadium</td> 
     <td/> 
     <td class="Crowds">Arsenal_Crowds</td> 
     <td/> 
     <td class="Finances">Arsenal_Finances</td> 
     <td/> 
     <td class="Outlook">Arsenal_Outlook</td> 
     <td/> 
    </tr> 
    <tr> 
     <td>1</td> 
     <td>4</td> 
     <td>5</td> 
     <td>8</td> 
     <td>9</td> 
     <td>14</td> 
     <td>15</td> 
     <td>18</td> 
    </tr> 
</table> 
+0

輝煌的解決方案,非常感謝您的幫助。 – 2013-04-04 22:57:47

+0

@ jay.james.666,不客氣。 – 2013-04-05 02:52:27

相關問題