2013-04-04 3 views
1

У меня есть вопрос XSLT, который следует из вопроса, который я задал ранее.Извлечение первого набора данных в пределах этого <root>

Задача состоит в извлечении из набора данных из повторного набора с тем же <root>. У меня есть пример XSLT-решения из моего предыдущего вопроса, предоставленного @Kirill Polishchuk.

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> 

Обобщение:

Легко обобщить эту трансформацию, чтобы обработать «набор-ю.

Например, следующее преобразование обрабатывает второй «набор» одного и того же, при условии, 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

Блестящее решение, Большое вам спасибо за помощь. –

+0

@ jay.james.666, Добро пожаловать. –

Смежные вопросы