Xpoint
   [напомнить пароль]

Сквозной подсчет элементов

Метки: [без меток]
2009-04-14 13:55:18 [обр] AndrewM[досье]

Господа! С XSLT разбираюсь недавно.
Вот какой вопрос.
Из XML:

<?xml version="1.0" encoding="windows-1251" ?>
<news-root>

  <news>
    <image src="pic_x.jpg" />
    <image src="pic_y.jpg" />
  </news>

  <news>
    <image src="pic_z.jpg" />
  </news>

  <!-- и т.п. --> 
</news-root>

Хочу получить XHTML:

<div>
  <img id="1" src="pic_x.jpg" />
  <img id="2" src="pic_y.jpg" />
</div>
<div>
  <img id="3" src="pic_z.jpg" />
</div>

и т.п.
Т.е. в частности, интересует как насквозь пронумеровать id?

спустя 1 день [обр] AndrewM[досье]

Или я спросил что-то очень глупое, или что-то очень сложное ;) Или не, не дай Бог, оскорбил чьи-то религиозные чувства! ;)
Или народ не доволен, что я своей попытки решения не привел..?
Ну вот начало решения, только без тех самых id, про генерацию которых я спрашивал.

<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xhtml" indent="yes" encoding="windows-1251"/>

  <xsl:template match="news">
    <div>
      <xsl:apply-templates select="image" />
    </div>    
  </xsl:template>

  <xsl:template match="image">
    <img id="" src="pics/{@src}" />
  </xsl:template>

</xsl:stylesheet>

Кажется, нужно использовать что-то вроде <xsl:number /> но не пойму каким макаром...

спустя 1 час 39 минут [обр] GRAy(64/259)[досье]

Может быть не самый эффективный способ:

<?xml version="1.0" encoding="windows-1251" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:template match="news-root">
 <xsl:apply-templates select="news" />
</xsl:template>
<xsl:template match="news" >
 <div>
  <xsl:apply-templates select="image">
   <xsl:with-param name="precnt" select="count(preceding-sibling::news/image)"/>
  </xsl:apply-templates>
 </div>
</xsl:template>
<xsl:template match="image" >
  <xsl:param name="precnt" />
  <img id="{$precnt+position()}" src="{@src}" />
</xsl:template>
</xsl:stylesheet>

главная неоптимальность в том, что в каждом элементе news идёт подсчёт у всех предсшествующих элементов news кол-ва image`й.

спустя 1 час 24 минуты [обр] AndrewM[досье]
Да, спасибо... ;) Через ... конечно, но работает! ;)))
А нельзя ли, кстати, просто посчитать количество выводов в переменную? Типа i++ ?
Я щас попытался - ничего не получается...
спустя 16 минут [обр] GRAy(64/259)[досье]
AndrewM[досье] Нельзя, xslt функциональный язык, поэтому никаких переменных в привычном смысле слова тут нет.
спустя 48 минут [обр] Dennis F. Latypoff aka funky_dennis(10/78)[досье]
В приложении, отдающим xml, никак не пронумеровать?
спустя 16 секунд [обр] Dennis F. Latypoff aka funky_dennis(10/78)[досье]
*отдающем
спустя 12 минут [обр] Lynn «Кофеман»(52/571)[досье]
Как-то так
<xsl:template match="image">
  <xsl:variable name="id">
    <xsl:number level="any" count="image"/>
  </xsl:variable>
  <img id="{$id}" src="pics/{@src}" />
</xsl:template>
спустя 33 минуты [обр] AndrewM[досье]
Dennis F. Latypoff aka funky_dennis[досье]
Не, вообще вопрос не в том, что "никак низя", а как средствами XSL?
спустя 14 часов [обр] GRAy(64/259)[досье]
Lynn «Кофеман»[досье] Круто, не знал о таком аспекте поведения xsl:number - это многое упрощает ;)
спустя 1 час 14 минут [обр] AndrewM[досье]
А я знал! Я чувствовал, что решение в xsl:number ! ;)
Спасибо, Lynn «Кофеман»[досье]
Powered by POEM™ Engine Copyright © 2002-2005