сортировка по дате

Alexandre

PHPПенсионер
сортировка по дате

Есть набор узлов, например
PHP:
<root>
  <node><text>bla-bla</text><data>12.01.2004</data></node>
  <node><text>bla-bla</text><data>21.01.2004</data></node>
  <node><text>bla-bla</text><data>01.02.2004</data></node>
  <node><text>bla-bla</text><data>02.02.2004</data></node>
</root>
Надо вывести их упорядоченными по дате.
Вывод:
12.01.2004 bla-bla
21.01.2004 bla-bla
01.02.2004 bla-bla
02.02.2004 bla-bla

как работает сортировка, если вместо 0 - стоит пробел
т.е. вместо 01.02.2004 будет _1._2.2004

-~{}~ 01.09.04 15:31:

делаю:
PHP:
<xsl:for-each select="root/node" >
  <xsl:sort select="substring(data,4,2)" data-type="number" />
  <xsl:sort select="substring(data,1,2)" data-type="number" />
  
  <xsl:value-of select="data"/>
  <xsl:value-of select="text"/>
</xsl:for-each >
- не сортировка работает
 

Miky

Guest
У меня твой шаблон работает, процессор MSXML.
 

Alexandre

PHPПенсионер
Miky проверь пожайлуста,
если дата представлена в ввиде
если вместо 0 - стоит пробел
т.е. вместо 01.02.2004 будет 1_.2_.2004
 

jian

Guest
mozhet ty prosto zabyl eto?
Код:
  <xsl:sort select="substring(data,7,4)" data-type="number" />
 

Alexandre

PHPПенсионер
jian
спасибо, что заметил - значение года - тоже немаловажно,
но пока я не могу разобраться с месяцем.
 

jian

Guest
mesyac vrode rabotaet.
poprobui zamenit
Код:
  <xsl:sort select="substring(data,7,4)" data-type="number" /> 
  <xsl:sort select="substring(data,4,2)" data-type="number" /> 
  <xsl:sort select="substring(data,1,2)" data-type="number" />
na
Код:
  <xsl:sort select="substring(translate(data, '_probel_', '0'),7,4)" data-type="number" /> 
  <xsl:sort select="substring(translate(data, '_probel_', '0'),4,2)" data-type="number" /> 
  <xsl:sort select="substring(translate(data, '_probel_', '0'),1,2)" data-type="number" />
-~{}~ 02.09.04 10:34:

vse dolzhno rabotat !
esli net - znachit ti chtoto ne dogovarivaesh, ili ty dal nam nepolnyi kod :(

davai polnym xml and xsl.
 

Alexandre

PHPПенсионер
esli net - znachit ti chtoto ne dogovarivaesh, ili ty dal nam nepolnyi kod
jian
Да,
может это потому-что я использую xsl-переменную:
PHP:
<xsl:variable name="unq_date" select="root/project/task/work[generate-id(.) = generate-id( key('k_dt', dt2 ) ) ]" />
      
<xsl:for-each select="$unq_date/dt2" >
   <xsl:sort select="concat(substring($unq_date/dt2,4,2), substring($unq_date/dt2,1,2))" data-type="number" />
   

      <xsl:call-template name="group" >
        <xsl:with-param name="date"><xsl:value-of select="text()"/></xsl:with-param> 
      </xsl:call-template>
      
</xsl:for-each>
-~{}~ 02.09.04 11:09:

вот что мне выдает такой код:
Код:
<xsl:for-each  select="$unq_date/dt2" >
	<xsl: copy-of select="$unq_date/dt2" /><br/>
</xsl:for-each>
PHP:
	   <work><id>14</id><name>Новая работа</name><task_id>41</task_id><dt>2004-09-01T00:00:00</dt><hours>8</hours><emp_id>1</emp_id><status>0</status><descr></descr><dt2>1 .9 .2004</dt2></work>
	   <work><id>26</id><name>Новая работа</name><task_id>66</task_id><dt>2004-09-02T00:00:00</dt><hours>8</hours><emp_id>1</emp_id><status>0</status><descr>sdfsdf</descr><dt2>2 .9 .2004</dt2></work>
	   <work><id>42</id><name>Новая работа2</name><task_id>41</task_id><dt>2004-08-31T00:00:00</dt><hours>8</hours><emp_id>1</emp_id><status>0</status><descr></descr><dt2>31.8 .2004</dt2></work>
       <work><id>52</id><name>Новая работа</name><task_id>84</task_id><dt>2004-08-30T00:00:00</dt><hours>1</hours><emp_id>1</emp_id><status>0</status><descr></descr><dt2>30.8 .2004</dt2></work>
// и так по кол-ву узлов
судя по всему сортировка работает если узлы входные,
а если они собраны и используются ключи, то это уже как-то упорядочивается по ключам....или работает иной скрытый механизм, о котором я не подозреваю :confused: :confused:
 

jian

Guest
ndaaa......
lana, ya po drugomu skazhu:

1)dai polnyi primer xml(ne ves xml a maximalno korotkii v toje vremya predstavitelnyi/representativnyi)(chtoby mojno bylo copy/paste sdelat)
2)i jelaemyi rezultat.


chtoti pytaeshsa sdelat?
zachem generate-id ispolzuesh?


ya shas popytayus dognat chto ty pytaesha sdelat.

-~{}~ 02.09.04 11:35:

tyomnyi les...
 

Alexandre

PHPПенсионер
jian
Посмотри - может что получится

PHP:
<root date="2004-09-02" order="ascending"><project><id>33</id><priority>1</priority><categ_id>3</categ_id><name>Новый проект_1</name><emp_id>1</emp_id><descr>gfsdgsdg sfsdfsfsdfs
121232121</descr><task><id>41</id><name>Новая задача1</name><plan_dt_beg>2004-08-17T00:00:00</plan_dt_beg><plan_dt_end>2004-08-17T00:00:00</plan_dt_end><emp_id>1</emp_id><proj_id>33</proj_id><status>0</status><descr></descr><work><id>14</id><name>Новая работа</name><task_id>41</task_id><dt>2004-09-01T00:00:00</dt><hours>8</hours><emp_id>1</emp_id><status>0</status><descr></descr><dt2>1 .9 .2004</dt2></work></task><task><id>66</id><name>Новая задача44</name><plan_dt_beg>2004-08-18T00:00:00</plan_dt_beg><plan_dt_end>2004-08-21T00:00:00</plan_dt_end><emp_id>1</emp_id><proj_id>33</proj_id><status>0</status><descr>sedwqerwq</descr><work><id>26</id><name>Новая работа</name><task_id>66</task_id><dt>2004-09-02T00:00:00</dt><hours>8</hours><emp_id>1</emp_id><status>0</status><descr>sdfsdf</descr><dt2>2 .9 .2004</dt2></work></task><task><id>41</id><name>Новая задача1</name><plan_dt_beg>2004-08-17T00:00:00</plan_dt_beg><plan_dt_end>2004-08-17T00:00:00</plan_dt_end><emp_id>1</emp_id><proj_id>33</proj_id><status>0</status><descr></descr><work><id>42</id><name>Новая работа2</name><task_id>41</task_id><dt>2004-08-31T00:00:00</dt><hours>8</hours><emp_id>1</emp_id><status>0</status><descr></descr><dt2>31.8 .2004</dt2></work></task></project><project><id>93</id><priority>1</priority><categ_id>1</categ_id><name>проект Никитина</name><emp_id>4</emp_id><descr></descr><task><id>84</id><name>задача для Никитина</name><plan_dt_beg>2004-08-18T00:00:00</plan_dt_beg><plan_dt_end>2004-08-18T00:00:00</plan_dt_end><emp_id>4</emp_id><proj_id>93</proj_id><status>0</status><descr>asdadsa asd ad ad
ad ad asd</descr><work><id>52</id><name>Новая работа</name><task_id>84</task_id><dt>2004-08-30T00:00:00</dt><hours>1</hours><emp_id>1</emp_id><status>0</status><descr></descr><dt2>30.8 .2004</dt2></work></task></project><action>mywork</action><role id="1" pm_id="">audi</role></root>
-~{}~ 02.09.04 13:33:

Результат таблица:
Работа | Проект | Задача

1 .9 .2004 (число )
Новая работа Новый проект_1 Новая задача1 8
Итого: 8

2 .9 .2004
Новая работа Новый проект_1 Новая задача44 8
Итого: 8

31.8 .2004
Новая работа2 Новый проект_1 Новая задача1 8
Итого: 8

30.8 .2004
Новая работа проект 2 задача_11 2
Новая работа проект 2 задача_12 2

Итого: 4

Даты должны быть в след порядке:
30.08
31.08
01.09
02.09

-~{}~ 02.09.04 13:34:
 

jian

Guest
xsl
Код:
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:key name="task" match="task" use="name()"/>

<xsl:template match="/">
<xsl:apply-templates
select="root/project/task[generate-id(.)=generate-id(key('task',name())[1])]"/> 
</xsl:template> 


<xsl:template match="task">
<xsl:apply-templates
select="key('task',name())" mode="enek"> 
<xsl:sort select="substring(work/dt2,7,4)" data-type="number"/>
<xsl:sort select="substring(work/dt2,4,2)" data-type="number"/>
<xsl:sort select="substring(work/dt2,1,2)" data-type="number"/>
</xsl:apply-templates>
</xsl:template>

<xsl:template match="task" mode="enek">
<xsl:value-of select="work/dt2"/>
<br/>
</xsl:template>

</xsl:stylesheet>
rezultat
Код:
30.8 .2004
31.8 .2004
1 .9 .2004
2 .9 .2004
 

Alexandre

PHPПенсионер
jian молодец, только у меня уже есть некая XSL ссборка и технология
по этому я вызываю свой шаблон <xsl:call-template name="test">

пытался применить твой пример, но знаний не хватает переделать на <xsl:call-template>
 

jian

Guest
v chem tvoya problema?
nado vizvat eto kak call-template?
otkuda vyzvat? iz kakogo kontentsa?

dai ___POLNOE___ obyasnenie problemy : )
 
Сверху