XML:XSLT: сортировать и концевые вложенные узлы
<node>
<node date="01-01-2002">Node</node>
<node date="01-01-2005">Node</node>
<node date="01-01-2001">Node</node>
<node date="01-01-2003">Node</node>
<node date="01-01-2006">Node</node>
<node>
<node date="01-01-2000">Node</node>
<node date="01-01-2007">Node</node>
</node>
<node date="01-01-2004">Node</node>
</node>
Проблема:
Мне нужно сортировать по дате и принимать ограниченное количество отсортированных узлов. Необходимо иметь возможность пройти любое количество уровней.
Требуемый результат:
<p>01-01-2000</p>
<p>01-01-2001</p>
<p>01-01-2002</p>
<p>01-01-2003</p>
<p>01-01-2004</p>
Предположения:
Для сортировки по дате Я использую C# метод расширения, который возвращает метку времени:
<xsl:sort select="cs:formatDate(@date)" order="ascending" data-type="number" />
Предел до 5 старых узлов.
Порядок: по возрастанию по
XSLT 1.0
EDIT: В соответствии с поручением это где я получил до сих пор: я могу сделать сортировку и ограничения для не вложенных узлов:
<xsl:template match="node">
<xsl:apply-templates select="node">
<xsl:sort select="cs:formatDate(@date,'dd-MM-yyyy','timestamp')" order="ascending" data-type="number" />
<xsl:with-param name="limit" select="5"/>
</xsl:apply-templates>
</xsl:template>
<xsl:template match="node[@date]">
<xsl:param name="limit" />
<xsl:if test="position() < $limit+1">
<h5><xsl:value-of select="@date"/></h5>
</xsl:if>
</xsl:template>
Или когда я попробуйте применить для вложенных, как показано ниже, я получаю вложенные узлы, отсортированные по отдельности, и я не могу их ограничивать таким же образом:
<xsl:template match="*">
<xsl:apply-templates select="node[@date]">
<xsl:sort select="cs:formatDate(@date,'dd-MM-yyyy','timestamp')" order="ascending" data-type="number" />
</xsl:apply-templates>
<xsl:apply-templates select="node[not(@date)]">
</xsl:apply-templates>
</xsl:template>
<xsl:template match="node[@date]">
<h5><xsl:value-of select="@date"/></h5>
</xsl:template>
<xsl:template match="node[not(@date)]">
<xsl:apply-templates select="node[@date]">
<xsl:sort select="cs:formatDate(@date,'dd-MM-yyyy','timestamp')" order="ascending" data-type="number" />
</xsl:apply-templates>
<xsl:apply-templates select="node[not(@date)]">
</xsl:apply-templates>
</xsl:template>
EDIT:
Я думал, что это очевидно, но, вероятно, не так: мне нужно сортировать применяться до предела. Например: «получить старейшие пять», а не: «получить первые пять узлов из XML, а затем отсортировать их»
И каков ваш вопрос? (Пожалуйста, предоставьте достаточно кода, чтобы на самом деле запустить что-то во время редактирования вашего вопроса.) –
@ChristopherCreutzig Вопрос описывается «проблемой» и «требуемым результатом». Я уточню, где я до сих пор. –
@ChristopherCreutzig Я обновил вопрос, где я до сих пор. –