Группировка и подсчет в XSLT 1.0

У меня есть входной XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <FT>Paket</FT>
   <FT>Parti</FT>
   <FT>Paket</FT>
   <FT>Styche</FT>
   <FT>Styche</FT>
</root>

И я хочу, чтобы мой вывод отображался, например, -

Paket   2
Parti   1
Styche  2

Это группировка значения элементов и номера. показывает общее количество повторяющихся значений. Например, пакет указывает значение, и оно повторяется 2 раза в XML.

Как будет работать логика?


person Kundan    schedule 07.11.2013    source источник
comment
Я не могу написать код здесь, так как это вывод изображения. Я пробовал с функциями группировки и подсчета, но не получил желаемого результата.   -  person Kundan    schedule 07.11.2013


Ответы (1)


В XSLT 1.0 с использованием группировки по Мюнху:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" indent="yes"/>
  <xsl:key name="k" match="FT" use="."/>

  <xsl:template match="/*">
    <xsl:apply-templates select="FT[generate-id() = generate-id(key('k', .))]"/>
  </xsl:template>

  <xsl:template match="FT">
    <xsl:value-of select="concat(., ' ', count(key('k', .)))"/>
    <xsl:text>&#xa;</xsl:text>
  </xsl:template>

</xsl:stylesheet>

Вывод:

Paket 2
Parti 1
Styche 2
person Kirill Polishchuk    schedule 07.11.2013
comment
Спасибо за ответ. Я хочу применить приведенную выше логику без шаблонов. Если это можно сделать. Хотя я применил ‹xsl:apply-templates select=FT[generate-id() = generate-id(key('k', .))]/›, он сгенерировал пакет, часть... но когда я добавил ‹ xsl:text› ‹/xsl:text› он не перешел на следующую строку. Кроме того, ‹xsl:value-of select=concat(., ' ', count(key('k', .)))/› не работал. Потому что я не применил к нему шаблон. - person Kundan; 07.11.2013