2013-10-24 3 views
0

Я наткнулся на эту маленькую проблему при создании файла XSLT ... У меня есть этот общий XML файл:XSLT: несколько таблиц

<data> 
    <folder> 
    <file> 
     <name>file1</name> 
     <date>2000</date> 
     <index1>1</index1> 
     <index2>1</index2> 
    </file> 

    <file> 
     <name>file2</name> 
     <date>2001</date> 
     <index1>1</index1> 
     <index2>1</index2> 
    </file> 

    <file> 
     <name>file3</name> 
     <date>2004</date> 
     <index1>2</index1> 
     <index2>1</index2> 
    </file> 
    </folder> 
</data> 

Учитывая это абстрактный пример, у меня есть, чтобы превратить его в нечто вроде:

<table> 
    <tr> 
    <td>Name</td> 
    <td>Date</td> 
    </tr> 
    <tr> 
    <td>file1</td> 
    <td>2000</td> 
    </tr> 
    <tr> 
    <td>file2</td> 
    <td>2001</td> 
    </tr> 
</table> 

<table> 
    <tr> 
    <td>Name</td> 
    <td>Date</td> 
    </tr> 
    <tr> 
    <td>file3</td> 
    <td>2004</td> 
    </tr> 
</table> 

Мне нужно сгруппировать элементы файла в таблицу на основе их index1 и index2 (например, пары идентификаторов). Я могу создать таблицу для каждого отдельного файла, но я не могу найти решение для создания таблицы для каждого файла обмена index1 и index2. Любая идея или предложение?

+0

Вы застряли в XSLT 1.0 или используете 2.0? Есть решения с обоими, но они довольно просты с XSLT 2. –

+0

Я использую XSLT 2.0. –

+0

Ваша жизнь стала проще тогда :) –

ответ

0

Поскольку вы используете XSLT 2.0, вы можете использовать инструкцию xsl:for-each-group. Здесь у вас есть два варианта, в зависимости от того, хотите ли вы объединить группы и уважать последовательность, или просто хотите сгруппировать, независимо от последовательности.

То есть, учитывая aabaab Вы бы хотели группы (aaaa, bb) или (aa, b, aa, b)?

Это первые группы все файловые элементы с одинаковыми index1 и index2 независимо от того, в документе (я поставил в body элемент просто, чтобы сделать его хорошо сформированные)

<xsl:template match="folder"> 
    <body> 
    <xsl:for-each-group select="file" group-by="concat(index1, '-', index2)"> 
     <!-- xsl:for-each-group sets the first element in the group as the context node --> 
     <xsl:apply-templates select="."/> 
    </xsl:for-each-group> 
    </body> 
</xsl:template> 

<xsl:template match="file"> 
    <table> 
     <tr> 
      <td>Name</td> 
      <td>Date</td> 
     </tr> 
     <xsl:apply-templates select="current-group()" mode="to-row"/> 
    </table> 
</xsl:template> 

<xsl:template match="file" mode="to-row"> 
    <tr> 
     <xsl:apply-templates select="name|date"/> 
    </tr> 
</xsl:template> 

<xsl:template match="name|date"> 
    <td><xsl:apply-templates/></td> 
</xsl:template> 

Вторая версия будет требуется только первый шаблон, измененный на:

<xsl:template match="folder"> 
    <body> 
    <xsl:for-each-group select="file" group-adjacent="concat(index1, '-', index2)"> 
     <xsl:apply-templates select="."/> 
    </xsl:for-each-group> 
    </body> 
</xsl:template> 
+0

Спасибо за вашу помощь! Это имеет большой смысл! Мне интересно, как бы аналогичная проблема выглядела в 1.0. –

+1

@theTech В XSLT 1.0 это будет с Muenchian Method. Есть множество вопросов о SO, которые охватывают это, если вам интересно. XSLT 2.0 делает это намного проще. –

+0

@MatthewGreen Я взглянул на этот метод. Приятно знать, что они улучшили эту проблему в версии 2.0! –

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