проблема в сортировке xml по дате <xsl: sort select = "" /> - PullRequest
3 голосов
/ 19 января 2010

Я пытаюсь отсортировать мой xml по дате, но он не работает, мои xml и xsl r вот так

<xsl:template match="/">
    <xsl:for-each select="news/item">
                        <xsl:sort select="date1" order="descending" />                                     

                          <xsl:value-of select="date1"/>                                

                  </xsl:for-each> 
</xsl:template>

MYXML

<news>
 <item>
<date1>January 1, 2010</date1>
 </item>
 <item>
  <date1>November 29, 2009</date1>
</news>


         Its displaying the result but not in sorted way..

Ответы [ 6 ]

4 голосов
/ 19 января 2010

Вы можете попробовать использовать что-то вроде этого:

<xsl:template match="/"> 
  <xsl:for-each select="news/item"> 
    <xsl:sort select="xs:date(date1)" order="descending" />
    <xsl:value-of select="date1"/>                                 
  </xsl:for-each>  
</xsl:template> 

Хотя, если у вас есть контроль над генерацией XML, я бы также добавил что-то вроде:

<date1 isoValue="20100101">January 1, 2010</date1>

А затем используйте

<xsl:sort select="xs:date(date1/@isoValue)" order="descending" />
4 голосов
/ 19 января 2010

xsl-sort не «знает», как сортировать даты. Для сортировки текста будет использоваться значение по умолчанию, хотя вы можете указать числовую сортировку с помощью атрибута data-type.

Существует несколько подходов для решения этой проблемы - добавьте атрибут или измените способ вывода даты в исходный XML, чтобы получить представление, которое можно отсортировать численно.

3 голосов
/ 20 июня 2010

Проверьте эту проблему для решения проблемы. Он использует сортировку XSLT для сортировки XML по датам в XML.

1 голос
/ 21 июня 2015

Дата в xml - это строка. Если дата не всегда выглядит так: гггг-мм-дд, вы действительно не можете отсортировать ее в правильном порядке.

Так что это правильный путь:

<xsl:sort select="newsDate"  order="ascending" />

Это будет работать как шарм.

0 голосов
/ 23 января 2018

Вы можете отсортировать поле date1, используя формат даты в США, чтобы создать строку год / месяц / дата, а затем отсортировать по убыванию. В теге xsl: for-each вы добавили бы следующее:

<xsl:sort select="ddwrt:FormatDateTime(string(@date1),1033,'yy/MM/dd')" order="descending" />
0 голосов
/ 14 января 2013

если у вас есть контроль над xml-генерацией:

Ввод:

<date1> 2010-10-17+02:00 </date1>

Преобразование:

<date1 number="{translate(substring-before(date1,'+'),'-','')}"
   <xsl:value-of select="date1"/>
</date1>`

Выход:

<date1 number="20101017">2010-10-17+02:00</date1>

чем вы можете использовать как обычно

<xsl:sort order="descending" select="@number" data-type="number"/>

Greetz

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...