2015-03-12 7 views
0

У меня есть проблема, когда у меня есть xml-контент с разными ключами, которые необходимо сгруппировать и отобразить, когда отображается отображаемая страница, поэтому я не могу отображать все записей на одной странице, я использую для-каждой-группы для группировки элементов, и цикл по текущей группе() и отобразить его элемент, XML-это что-то вроде этого:с использованием счетчика для всех членов группы для каждой группы

<entry> 
    <key>key1</key> 
    <value>value1</value> 
</entry> 

<entry> 
    <key>key2</key> 
    <value>value2</value> 
</entry> 

<entry> 
    <key>key1</key> 
    <value>value3</value> 
</entry> 
<entry> 
    <key>key1</key> 
    <value>value4</value> 
</entry> 
<entry> 
    <key>key3</key> 
    <value>value5</value> 
</entry> 
<entry> 
    <key>key2</key> 
    <value>value6</value> 
</entry> 
<entry> 
    <key>key4</key> 
    <value>value7</value> 
</entry> 
<entry> 
    <key>key3</key> 
    <value>value8</value> 
</entry> 
<entry> 
    <key>key5</key> 
    <value>value9</value> 
</entry> 
<entry> 
    <key>key1</key> 
    <value>value10</value> 
</entry> 
<entry> 
    <key>key2</key> 
    <value>value11</value> 
</entry> 

, который должен дисплей как:

Page1:

key1 
    value1 
    value3 
    value4 
    value10 

key2 
    value2 
    value6 
    value11 
key3 
    value5 
    value8 
key4 
    value7 

Page2:

key5 
    value9 

XSL Я использую без пагинацией является

<xsl:for-each-group select="entry" group-by="key"> 
    <xsl:value-of select="current-grouping-key()"/> 
    <xsl:for-each select="current-grouping()"> 
      <xsl:apply-templates select="." /> 
     </xsl:for-each> 
</xsl:for-each-group> 

мне нужно отобразить только 10 пунктов на каждой странице, как я могу получить количество предшествующих записей тока -grouping()

редактировать для получения дополнительной информации:

у меня есть переменный размер $ и $ вне офиса, что я в основном пытаюсь сделать некоторые вещи, как:

<xsl:if test="$count &gt; $offset and $count &lt;= $offset + $size"> 
    <xsl:apply-templates select="." /> 
</xsl:if> 

где $ подсчет будет иметь количество всех элементов уже оказываемых, в идеале, если некоторые, как я могу создать счетчик, аналогичную позицию() в наличии для каждого, но он не перезагружается при каждом цикле текущей группы().

, если я не хочу элементов группы от ключа, я бы сделал что-то вроде этого:

<xsl:for-each select="entry"> 
     <xsl:if test="position() &gt; $offset and position() &lt;= $offset + $size"> 
       <xsl:apply-templates select="." /> 
     </xsl:if> 
</xsl:for-each> 

но теперь, поскольку я использую для-каждой группы, а также записей каждой группы как я могу отслеживать записи, которые уже отображены из предыдущих групп.

+0

Пожалуйста, покажите нам пример более 10 записей и ожидаемый итоговый код преобразования этого примера. –

+0

Я обновил пример, чтобы иметь более 10 записей. – Shadi

+0

На самом деле, покажите документ XML-документа _complete_ и таблицу стилей _complete_: http://stackoverflow.com/help/mcve. –

ответ

2

Вы можете сделать это в два этапа - сначала переупорядотите весь неагрегированный список записей, чтобы они были сгруппированы вместе с ключом (то есть в том порядке, в котором требуется конечный результат), затем возьмите соответствующую страницу «срез» эта последовательность, чтобы сделать фактическое преобразование:

<xsl:variable name="orderedEntries" as="element()*"> 
    <xsl:for-each-group select="entry" group-by="key"> 
    <xsl:sequence select="current-group()" /> 
    </xsl:for-each-group> 
</xsl:variable> 

<xsl:for-each-group select="$orderedEntries[ 
      position() &gt; $offset and position() &lt;= $offset + $size]" 
    group-by="key"> 
    <xsl:value-of select="current-grouping-key()"/> 
    <xsl:for-each select="current-group()"> 
    <xsl:apply-templates select="." /> 
    </xsl:for-each> 
</xsl:for-each-group> 

Это будет работать, даже если разрыв страницы частично проходит через группу, например $offset и $size 5 учитывая ваш пример ввода будет производить

key2 
    value6 
    value11 
key3 
    value5 
    value8 
key4 
    value7 

P.S. а Мартин отмечает в комментарии, то

<xsl:for-each select="current-group()"> 
    <xsl:apply-templates select="." /> 
    </xsl:for-each> 

для большинства целей эквивалентна просто

<xsl:apply-templates select="current-group()"/> 

(единственная разница в том, в значениях position() и last(), что называемые шаблоны см)

+1

'должно быть' ', no? –

+0

@MartinHonnen это может быть, да, я просто скопировал код OP (я просто меняю то, что выбирает их 'for-each-group', а не то, что он делает с выбранными узлами). Хотя я скорректировал 'current-grouping()' на 'current-group()', спасибо за указание, что бит. –

+0

Спасибо, это работает отлично. – Shadi

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