ОБНОВЛЕНИЕ - Новый код внизу
Я пытаюсь понять, как использовать функцию сортировки, чтобы извлечь самую последнюю запись из некоторых 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>
Игнорируя промтионид, вы можете показать мне, как я буду сортировать по убыванию ТОЛЬКО по дате? Я попытался удалить. К сожалению, я знаю, что даты должны иметь статическую длину, но мы не можем контролировать получаемые данные: - (
Также вы можете порекомендовать книгу для начала, чтобы действительно лучше понять все это? Вы оказал огромную помощь!