2017-02-05 8 views
1

Нам нужно сделать строки таблицы группировки в содержимом первого столбца, а затем выполнить определенную обработку для каждой строки в группе. Содержимое первого столбца - цифры. К нему будет применен for-each-group, если в столбцах нет количества цифр.XSLT-2.0: группировка по содержимому узла

Пример входных данных:

<table> 
 
    <tr><td>1</td></tr> 
 
    <tr><td>2</td></tr> 
 
    <tr><td>1</td></tr> 
 
    <tr><td>1,2,3</td></tr> 
 
    <tr><td>1,4</td></tr> 
 
</table>

В соответствии с этой задачей, я должен иметь 4 группы:

  • с номером 1 в колонке: 1,3,4 , 5-й ряд;
  • с номером 2 в колонке 2 и строке 4;
  • Номер 3: 4th;
  • 4: 5.

Общий шаблон выглядит следующим образом:

<xsl:template match="table"> 
 
    <xsl:for-each-group select="tr" group-by="td[1]"> 
 
    <xsl:for-each select="current-group()"> 
 
    <!-- transformation --> 
 
    </xsl:for-each> 
 
    </xsl:for-each-group> 
 
</xsl:template>

Так что group-by = "td [1]" не работает.
Ключ с регулярными выражениями ... Мне сложно.

ответ

2

Звучит так, как будто вы хотите заменить <xsl:for-each-group select="tr" group-by="td[1]"> на <xsl:for-each-group select="tr" group-by="tokenize(td[1], ',')">.

0

Я думаю, что вы говорите, что

  1. В качестве вклада у вас есть таблица со строками и столбцами.
  2. Первый столбец каждой строки содержит список чисел, разделенных запятыми. Строки могут содержать дополнительные столбцы, хотя они не показаны в вашем примере.
  3. В качестве вывода вы хотели бы получить одну группу для каждого отдельного числового значения в наборе списков чисел с разделителями-запятыми, состоящую из строк, которые включают это числовое значение в список, разделенный запятыми, в их первом столбце.

Из последней точки следует, что строка будет отображаться либо один раз для каждой цифры в списке с разделителями-запятыми в ее первом столбце, либо один раз для каждого отдельного значения в этом списке (spec not clear).

Я хотел бы попробовать

<xsl:for-each-group select="tr" 
    group-by="tokenize(td[1],',')"> 
    <xsl:message>Now processing <xsl:value-of 
     select="count(current-group()"/>rows containing <xsl:value-of 
     select="current-grouping-key()"/> in column 1.</ 
    ... 
</ 

(Не тестировалось.)

0

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

<xsl:template match="table"> 
    <xsl:variable name="row-data"> 
     <xsl:for-each select="tr/td"> 
      <xsl:variable name="row" select="position()" /> 
      <xsl:for-each select="tokenize(., ',')"> 
       <data> 
       <xsl:attribute name="row" select="$row" /> 
       <xsl:attribute name="value" select="." /> 
       </data> 
      </xsl:for-each> 
     </xsl:for-each> 
    </xsl:variable> 

    <data> 
     <xsl:for-each-group select="$row-data/*" group-by="@value"> 
     <group> 
      <xsl:attribute name="value" select="@value" /> 
      <xsl:value-of select="current-group()/@row" separator=","/> 
     </group> 
     </xsl:for-each-group> 
    </data> 
</xsl:template> 
Смежные вопросы