и снова группировка

demmi

Guest
и снова группировка

Добрый день, перечитав несколько топиков на данную тему пытаюсь изваять своё ))
Итак, допустим, есть xml причем, менять его структуру не желательно.
Код:
...
<pages>
[COLOR=red]
<start>
<items>
<item name="id">1</item>
<item name="title">Site</item>
<item name="data">01.01.01</item>
</items>
</start>
[/COLOR]
<news>
<items>
<item name="id">2</item>
<item name="title">News2</item>
<item name="data">02.02.02</item>
</items>
<items>
<item name="id">3</item>
<item name="title">News3</item>
<item name="data2">03.03.03</item>
<item name="autor">Autor</item>
</items>
</news>
</pages>
И есть некий шаблон:
Код:
<xsl:template match="/pages">
   <html><head><title></title></head>
      <body>
         <xsl:apply-templates select="news"/>
      </body>
   </html>
</xsl:template>

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

<xsl:template match="items">
   <xsl:for-each select="item">
      <xsl:value-of select="current()[not(preceding::item/@name=@name)]/@name"/>
   </xsl:for-each>
</xsl:template>
В результате группировка идет по всему дереву а надо только ниже <news>

Как сделать контекстную группировку, т.е без узлов помеченных красным?
 

Popeye

Guest
а сделать
<xsl:template match="/pages/news">

неполучается ?
 

demmi

Guest
А что это собственно дает?
Автор оригинала: Popeye
а сделать
<xsl:template match="/pages/news">

неполучается ?
...вообщето куски
Код:
<xsl:template match="/pages/news">
...
</xsl:template>
и
Код:
<xsl:template match="news">
         <xsl:apply-templates select="items"/>
    </xsl:template>
находятся в разных файлах...

Тут дело не в компановке, а в том что не получается задать контекст для ...preceding::item/@name... хотя может его задать и можно но выбрать уникальные узлы у меня не получалось...
По хорошему надо сначала сортировать, а потом сравнивать по оси preceding-sibling. ! Но в той "убогой" либе для PHP5 в два прохода вообще что-то сделать не реально.. :(

-~{}~ 25.11.04 14:33:

работает эта конструкция

Код:
    <xsl:template match="item">
        <xsl:if test="not(following::item/@name=@name)">
            <xsl:value-of select="@name"/>
        </xsl:if>
    </xsl:template>
но только если после требуемого блока группировки ничего нет :( опять же не универсально...

-~{}~ 25.11.04 15:16:

Нашел решение..
если кому надо
<xsl:template match="item">
<xsl:if test="not(preceding::item[parent::items//parent::news]/@name=@name)">
<xsl:value-of select="@name"/>
</xsl:if>
</xsl:template>

XPath - рулит однозначна!
 
Сверху