LINUX.ORG.RU

Вопрос по XSLT, работа со строками (?)

 ,


1

1

Нужно из XML-списка стран в HTML сделать меню такого вида:

А  Абхазия

Б  Болгария
   Беларусь

И  Индия
   Италия
   Испания

К  Кипр
   Крит

Хоть убей, не могу придумать, как это реализовать с помощью XSLT 1.0.

Есть XML вида:

<items>
    <item id="1" name="Абхазия" />
    <item id="2" name="Болгария" />
    <item id="3" name="Беларусь" />
    <item id="4" name="Индия" />
    <item id="5" name="Италия" />
    <item id="6" name="Испания" />
    <item id="7" name="Кипр" />
    <item id="8" name="Крит" />
</items>

Надо преобразовать в HTML вида:

<table>
    <tr>
        <td class="letter">А</td>
        <td><a href="#">Абхазия</a></td>
    </tr>

    <tr>
        <td class="letter" rowspan="2">Б</td>
        <td><a href="#">Беларусь</a></td>
    </tr>
    <tr>
        <td><a href="#">Болгария</a></td>
    </tr>

    <tr>
        <td class="letter" rowspan="3">И</td>
        <td><a href="/">Индия</a></td>
    </tr>
    <tr>
        <td><a href="/">Испания</a></td>
    </tr>
    <tr>
        <td><a href="/">Италия</a></td>
    </tr>
    
    <tr>
        <td class="letter" rowspan="2">К</td>
        <td><a href="/">Кипр</a></td>
    </tr>
    <tr>
        <td><a href="/">Крит</a></td>
    </tr>
</table>

То-есть, чтобы вид был

★★

<xsl:stylesheet version="1.0"
		xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="items">
    <table>
      <xsl:apply-templates select="item"/>
    </table>
  </xsl:template>

  <xsl:template match="item">
    <tr>
      <td class="letter">
	<xsl:value-of select="substring(./@name,1,1)"/>
      </td>
        <td><a href="#"><xsl:value-of select="./@name" /></a></td>
    </tr>
  </xsl:template>

</xsl:stylesheet>
anonymous
()
Ответ на: комментарий от anonymous

Сори, не заметил группировку.

anonymous
()

Купи какому-нибудь бомжу немного еды.

<xsl:stylesheet version="1.0"
		xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:key name="countries-by-first-letter" match="/items/item" use="substring(./@name, 1, 1)" />

  <xsl:template match="items">
    <table>
      <xsl:for-each select="item[count(. | key('countries-by-first-letter', substring(./@name, 1, 1))[1]) = 1]">
	<!-- Sort by the Category -->
	<xsl:sort select="substring(./@name, 1, 1)" />
	<xsl:variable name="rowspan" select="count(key('countries-by-first-letter', substring(./@name, 1, 1)))" />

	<xsl:for-each select="key('countries-by-first-letter', substring(./@name, 1, 1))">
          <xsl:sort select="@name" />

	  <tr>
	    <xsl:if test="position() = 1">
              <td class="letter" rowspan="{$rowspan}">
		<xsl:value-of select="substring(./@name, 1, 1)" />
	      </td>
	    </xsl:if>
            <td><a href="#"><xsl:value-of select="@name" /></a></td>
	  </tr>
	</xsl:for-each>
      </xsl:for-each>
    </table>
  </xsl:template>

</xsl:stylesheet>
anonymous
()
Ответ на: комментарий от sholom

Во-первых, мне нравится XSLT. Во-вторых, используемая CMS использует XSLT.

VeroLom ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.