Сортировка с помощью XSLT

ОБНОВЛЕНИЕ - Новый код внизу

Я пытаюсь понять, как использовать функцию сортировки, чтобы извлечь самую последнюю запись из некоторых XML-данные. Я новичок в использовании XSLT и столкнулся с кучей проблем. Вот пример моих данных ...

<content date="1/13/2011 1:21:00 PM">
    <collection vo="promotion">
        <data vo="promotion" promotionid="64526" code="101P031" startdate="1/7/2011 12:00:00 AM"/>
        <data vo="promotion" promotionid="64646" code="101P046" startdate="1/9/2011 12:00:00 AM"/>
    </collection>
</content>

Я хочу отсортировать данные по идентификатору продвижения в порядке убывания, а затем выдавать ТОЛЬКО через HTML самый высокий идентификатор продвижения. Вот пример того, что я пытался

ОБНОВЛЕНИЕ - это последняя версия кода, которая все еще испытывает проблемы.

<html><body>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"  encoding="UTF-8" />
    <xsl:template match="content/collection/data">
        <xsl:apply-templates>
            <xsl:sort select="promotionid" order="descending" data-type="number" />
        </xsl:apply-templates>
    </xsl:template>
    <xsl:template match="content/collection">
        <xsl:value-of select="data/@promotionid" />
    </xsl:template> 
</xsl:stylesheet>
</body></html>

Хотя это действительно возвращает результаты, я получаю «64526», а НЕ «64646». '.

Кто-нибудь может помочь? Также я видел примеры в Интернете, где вы можете сортировать по нескольким полям. Возможно, стоит отметить сейчас, а не спрашивать позже, что мы можем захотеть завершить сортировку по дате начала, а не по продвижению. Мне удалось придумать код, чтобы разбить дату на ГГГГ, ММ и ДД, но я понятия не имею, как я бы даже начал использовать это, кроме использования их в качестве моего выбора параметра сортировки, но я не знать, работает это на самом деле или нет.

Year
<xsl:value-of select="substring(substring-after(substring-after(data/@startdate,'/'),'/'),1,4)" />

Month
<xsl:value-of select="substring-before(data/@startdate,'/')" />

Day
<xsl:value-of select="substring-before(substring-after(data/@startdate,'/'),'/')" />

Заранее благодарю, и я прошу прощения за мои далеко не новички в навыках XSLT.

----------------------- -------------------------------

После некоторой помощи код изменился, но все еще не работает должным образом. . Вот код ...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"  encoding="UTF-8" />
    <xsl:template match="content/collection/">
            <xsl:apply-templates>
                <xsl:sort select="@promotionid" order="descending" data-type="number" />
            </xsl:apply-templates>
        </xsl:template>

 <xsl:template match="content/collection/data">
        <xsl:if test="position()=1">
                   <xsl:value-of select="@promotionid"/>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

И я все еще вижу меньшее значение вывода, а не большее. Может, есть другой способ сделать это без сортировки? Поскольку я тоже открыт для такой возможности.

14.01.11 10:37 Обновление Мне удалось придумать код, чтобы разбить дату на ГГГГ, ММ и ДД, но я понятия не имею, как я бы даже начал использовать это, помимо использования их в качестве моего выбора параметра сортировки, но я не знать, работает это на самом деле или нет.

Year
<xsl:value-of select="substring(substring-after(substring-after(data/@startdate,'/'),'/'),1,4)" />

Month
<xsl:value-of select="substring-before(data/@startdate,'/')" />

Day
<xsl:value-of select="substring-before(substring-after(data/@startdate,'/'),'/')" />

Заранее благодарю, и я прошу прощения за мои далеко не новички в навыках XSLT.

----------------------- -------------------------------

После некоторой помощи код изменился, но все еще не работает должным образом. . Вот код ...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"  encoding="UTF-8" />
    <xsl:template match="content/collection/">
            <xsl:apply-templates>
                <xsl:sort select="@promotionid" order="descending" data-type="number" />
            </xsl:apply-templates>
        </xsl:template>

 <xsl:template match="content/collection/data">
        <xsl:if test="position()=1">
                   <xsl:value-of select="@promotionid"/>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

И я все еще вижу меньшее значение вывода, а не большее. Может, есть другой способ сделать это без сортировки? Поскольку я тоже открыт для такой возможности.

14.01.11 10:37 Обновление Мне удалось придумать код, чтобы разбить дату на ГГГГ, ММ и ДД, но я понятия не имею, как я бы даже начал использовать это, кроме использования их в качестве моего выбора параметра сортировки, но я не знать, работает это на самом деле или нет.

Year
<xsl:value-of select="substring(substring-after(substring-after(data/@startdate,'/'),'/'),1,4)" />

Month
<xsl:value-of select="substring-before(data/@startdate,'/')" />

Day
<xsl:value-of select="substring-before(substring-after(data/@startdate,'/'),'/')" />

Заранее благодарю, и я прошу прощения за мои далеко не новички в навыках XSLT.

----------------------- -------------------------------

После некоторой помощи код изменился, но все еще не работает должным образом. . Вот код ...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"  encoding="UTF-8" />
    <xsl:template match="content/collection/">
            <xsl:apply-templates>
                <xsl:sort select="@promotionid" order="descending" data-type="number" />
            </xsl:apply-templates>
        </xsl:template>

 <xsl:template match="content/collection/data">
        <xsl:if test="position()=1">
                   <xsl:value-of select="@promotionid"/>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

И я все еще вижу меньшее значение вывода, а не большее. Может, есть другой способ сделать это без сортировки? Поскольку я тоже открыт для такой возможности.

14.01.11 10:37 Обновление но я не знаю, работает это на самом деле или нет.

Year
<xsl:value-of select="substring(substring-after(substring-after(data/@startdate,'/'),'/'),1,4)" />

Month
<xsl:value-of select="substring-before(data/@startdate,'/')" />

Day
<xsl:value-of select="substring-before(substring-after(data/@startdate,'/'),'/')" />

Заранее благодарю, и я прошу прощения за мои далеко не новички в навыках XSLT.

------------------ ------------------------------------

После некоторой помощи здесь код изменился, но он все еще не работает как задумано. Вот код ...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"  encoding="UTF-8" />
    <xsl:template match="content/collection/">
            <xsl:apply-templates>
                <xsl:sort select="@promotionid" order="descending" data-type="number" />
            </xsl:apply-templates>
        </xsl:template>

 <xsl:template match="content/collection/data">
        <xsl:if test="position()=1">
                   <xsl:value-of select="@promotionid"/>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

И я все еще вижу меньшее значение вывода, а не большее. Может, есть другой способ сделать это без сортировки? Поскольку я тоже открыт для такой возможности.

14.01.11 10:37 Обновление но я не знаю, работает это на самом деле или нет.

Year
<xsl:value-of select="substring(substring-after(substring-after(data/@startdate,'/'),'/'),1,4)" />

Month
<xsl:value-of select="substring-before(data/@startdate,'/')" />

Day
<xsl:value-of select="substring-before(substring-after(data/@startdate,'/'),'/')" />

Заранее благодарю, и я прошу прощения за мои далеко не новички в навыках XSLT.

------------------ ------------------------------------

После некоторой помощи здесь код изменился, но все еще не работает как задумано. Вот код ...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"  encoding="UTF-8" />
    <xsl:template match="content/collection/">
            <xsl:apply-templates>
                <xsl:sort select="@promotionid" order="descending" data-type="number" />
            </xsl:apply-templates>
        </xsl:template>

 <xsl:template match="content/collection/data">
        <xsl:if test="position()=1">
                   <xsl:value-of select="@promotionid"/>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

И я все еще вижу меньшее значение вывода, а не большее. Может, есть другой способ сделать это без сортировки? Поскольку я тоже открыт для такой возможности.

14.01.11 10:37 Обновление

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"  encoding="UTF-8" />
    <xsl:template match="content/collection/">
            <xsl:apply-templates>
                <xsl:sort select="@promotionid" order="descending" data-type="number" />
            </xsl:apply-templates>
        </xsl:template>

 <xsl:template match="content/collection/data">
        <xsl:if test="position()=1">
                   <xsl:value-of select="@promotionid"/>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

И я все еще вижу меньшую отдачу, чем большую. Может, есть другой способ сделать это без сортировки? Поскольку я тоже открыт для такой возможности.

14.01.11 10:37 Обновление

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="html"  encoding="UTF-8" />
    <xsl:template match="content/collection/">
            <xsl:apply-templates>
                <xsl:sort select="@promotionid" order="descending" data-type="number" />
            </xsl:apply-templates>
        </xsl:template>

 <xsl:template match="content/collection/data">
        <xsl:if test="position()=1">
                   <xsl:value-of select="@promotionid"/>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

И я все еще вижу меньшую отдачу, чем большую. Может, есть другой способ сделать это без сортировки? Поскольку я тоже открыт для такой возможности.

14.01.11 10:37 Обновление * ---------------------------------------------- --------------------- * Хорошо, используя этот код, теперь действительно сортирует данные и выводит наивысший номер промоакции. Спасибо, Тон!

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
    <xsl:template match="node()|@*">
      <xsl:copy>
         <xsl:apply-templates select="node()|@*"/>
      </xsl:copy>
    </xsl:template>

    <xsl:template match="collection">
      <xsl:copy>
        <xsl:apply-templates select="@*"/>
        <xsl:apply-templates select="data">
         <xsl:sort select="@promotionid" data-type="number" order="descending"/>
        </xsl:apply-templates>
      </xsl:copy>
    </xsl:template>
<xsl:template match="content/collection/data">
        <xsl:if test="position()=1">
                   <xsl:value-of select="@promotionid"/>
        </xsl:if>
    </xsl:template>
</xsl:stylesheet>

Игнорируя промтионид, вы можете показать мне, как я буду сортировать по убыванию ТОЛЬКО по дате? Я попытался удалить. К сожалению, я знаю, что даты должны иметь статическую длину, но мы не можем контролировать получаемые данные: - (

Также вы можете порекомендовать книгу для начала, чтобы действительно лучше понять все это? Вы оказал огромную помощь!

5
задан dscl 14 January 2011 в 16:42
поделиться