2013-04-04 42 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

相关问题