Сортировать по дате в XSL - PullRequest
0 голосов
/ 12 марта 2010

Я пытаюсь отсортировать по дате для вывода XML. Вот мой XSL:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Example by Phil 'iwonder' Guerra -->
<!-- Edited by Lee Sykes DNN Creative Magazine http://www.dnncreative.com -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="html" indent="yes"/>
    <xsl:param name="TITLE"/>

    <xsl:template match="rss">

        <!-- Do not show channel image -->
        <!-- Do not select the first item (this is useful if there are advertisements, such as using an RSS feed from moreover.com-->
        <xsl:for-each select="channel/item[position() &gt; 0]">

            <!-- Test to limit number of items displayed.  Here only 5 items will be transformed -->
            <xsl:if test="position() &lt; 5">

                <br></br>
                <!-- to open links in a new window, change target="_main" to target="_blank" -->
                <strong><a href="{link}" target="_blank"><xsl:value-of select="title"/></a></strong>
                <br>
                    <!-- <xsl:value-of select="pubDate"/> -->
                </br>
                <!-- only display 100 characters of the description, and allow html -->
                <xsl:value-of disable-output-escaping="yes" select="description"/>

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

    </xsl:template>

    <xsl:template match="description">
        <br>
            <xsl:value-of select="."/>
        </br>
    </xsl:template>

    <xsl:template name="strip-tags">
        <xsl:param name="text"/>
        <xsl:choose>
            <xsl:when test="contains($text, '&lt;')">
                <xsl:value-of select="substring-before($text, '&lt;')" />
                <xsl:call-template name="strip-tags">
                    <xsl:with-param name="text" select="substring-after($text, '&gt;')"/>
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="substring($text, 1, 100)" />
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

</xsl:stylesheet>

Я пытаюсь отсортировать по убыванию, используя введенную дату в моем XML:

<item>
    <title>Media Director</title>
    <entereddate>4/2/2009</entereddate>
    <referencenumber>01646359</referencenumber>
    <description><![CDATA[Leading Cleveland-based Award-Winning Integrated Marketing Communications firm seeks a passionate Media Director to lead a team of media planning and buying professionals and Fortune 500 clients.  This individual will be responsible to develop strategic and innovative traditional and nontraditional consumer engagement solutions including emerging media. This leader will play a large role in new business.  Ten years experience in media planning and buying as well as five years of management required. The environment is collaborative with many creative perks.]]></description>
    <city>Cleveland</city>
    <state>OH</state>
    <country>United States of America</country>
    <salary>$0.00 - $0.00 / $0.00/hr - $0.00/hr</salary>
    <guid isPermaLink="false">http://employment.topechelon.com/web77391/jobseeker/sSetup.asp?runsearch=1&amp;spJobAdId=01646359</guid>
    <link>http://employment.topechelon.com/web77391/jobseeker/sSetup.asp?runsearch=1&amp;spJobAdId=01646359</link>
</item>

Любая помощь будет оценена!
Спасибо

Ответы [ 3 ]

1 голос
/ 13 марта 2010

Даты в документах XML всегда должны быть отформатированы как ГГГГ-ММ-ДД. Это формат, который использует тип данных XML Schema date, и этот формат можно легко отсортировать в XSLT и манипулировать с помощью ограниченных строковых функций XSLT.

1 голос
/ 13 марта 2010

Если даты всегда в обычном формате (например, мм / дд / гггг), вы можете использовать 3 клавиши сортировки.

<xsl:for-each select="channel/item[position() &gt; 0]">
    <xsl:sort select="substring-after(substring-after(entereddate,'/'),'/')" data-type="number" /> <!-- year -->
    <xsl:sort select="substring-before(entereddate,'/')" data-type="number" /> <!-- month -->
    <xsl:sort select="substring-before(substring-after(entereddate,'/'),'/')" data-type="number" /> <!-- day -->

</xsl:for-each>

Однако, если даты могут быть в других форматах, таких как «13 марта 2010 г.», вам необходимо проанализировать и преобразовать даты в сортируемый формат (ггггммдд).

Exslt имеет функции расширений для манипулирования датами. Комментарии в вашей таблице стилей предполагают, что вы используете .NET, exslt доступен для .NET из проекта MvpXml .

0 голосов
/ 12 марта 2010

XSLT может помочь с сортировкой, но не подходит для дат.AFAIK, самый простой способ решить эту проблему - создать строку с CCYYMMDD (Century, Year, Month, Day) из имеющегося у вас поля даты и использовать ее для сортировки по алфавиту при выборе.При выводе используйте текст «как есть».

комбинацияи подстрока (поле даты, xx, 2) + подстрока ...

Надеюсь, это поможет,

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