2013-04-15 8 views
0

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() &lt; $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, а затем отсортировать их»

+0

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

+0

@ChristopherCreutzig Вопрос описывается «проблемой» и «требуемым результатом». Я уточню, где я до сих пор. –

+0

@ChristopherCreutzig Я обновил вопрос, где я до сих пор. –

ответ

2

<xsl:template match="/"> 
    <xsl:apply-templates select="//node[@date]"> 
     <xsl:sort select="concat(substring-after(substring-after(@date,'-'),'-'),substring-before(substring-after(@date,'-'),'-'),substring-before(@date,'-'))" order="ascending" data-type="number" /> 
     <xsl:with-param name="start" select="1"/> 
     <xsl:with-param name="end" select="5"/> 
    </xsl:apply-templates> 
</xsl:template> 

<xsl:template match="node"> 
    <xsl:param name="start" /> 
    <xsl:param name="end" /> 
    <xsl:if test="position() &gt;= $start and position() &lt;= $end"> 
     <p> 
      <xsl:value-of select="@date"/> 
     </p> 
    </xsl:if> 
</xsl:template> 

+0

от '

+0

@SergejPopov Я отредактировал свой ответ. Foreach был плохим, потому что он уже не учитывает отсортированную позицию(). –

+0

Вы протестировали решение? Он имеет несколько проблем. 1: Сокращенный шаг '.' не может следовать предикат. (Может быть, это просто процессор, который я использую ..) 2: У узлов хоста нет атрибута даты, следовательно, ошибка 3: даже если вы разобрались выше 2, вы получите вложенные узлы, отсортированные по отдельности, не все вместе –

Смежные вопросы