xsl объединяет элементы и сортирует по дате - PullRequest
1 голос
/ 09 августа 2010

У меня есть следующий xml

<Values>
 <New>
    <value>110</value>
    <date>2009-10-15</date>
  </New>
  <Previous>
    <value>100</value>
    <date>2010-10-15</date>
  </Previous>
  <Previous>
    <value>130</value>
    <date>2008-10-15</date>
  </Previous>
</Values>

Я использую следующий xsl

 <xsl:variable name="mergedData">
       <xsl:for-each select="//Values/New">
             <xsl:copy-of select="."/>
       </xsl:for-each>
       <xsl:for-each select="//Values/Previous">
             <xsl:copy-of select="."/>
       </xsl:for-each>
    </xsl:variable>


<xsl:for-each select="msxsl:node-set($mergedData)">
     <xsl:sort order="descending" select="substring(date,1,4)"/>
     <xsl:sort order="descending" select="substring(date,6,2)"/>
     <xsl:sort order="descending" select="substring(date,9,2)"/>
         <xsl:if test="position()=1">
              <xsl:value-of select="."/>
          </xsl:if>
</xsl:for-each>

И я получаю следующее.

110 2009-10-15 100 2010-10-15 130 2008-10-15

Это некажется, сортирует по дате, и это возвращает мне кусок кода, который мне нужно отсортировать по дате и иметь возможность манипулировать данными, чтобы я мог поместить их в строки таблицы.

Вот так.

110 2009-10-15 
100 2010-10-15 
130 2008-10-15

Ответы [ 2 ]

3 голосов
/ 10 августа 2010

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

Вот так.

110 2009-10-15  
100 2010-10-15  
130 2008-10-15

Нет , код (если бы он был правильным) вывел бы строковое значение одного из элементов New или Previous смаксимум date.

Вот основная проблема в вашем коде :

<xsl:for-each select="msxsl:node-set($mergedData)"> 

функция расширения msxsl:node-set() возвращает дерево документа - не верхний элемент или фрагмент XML.Другими словами, он возвращает корневой узел: / этого дерева документов.

Следовательно, <xsl:for-each> выше выбирает только один узел , и этот узел имеетдочерние элементы, которые являются New или Previous элементами.Следовательно, сортировки не существует, поскольку результатом сортировки одного узла всегда является один и тот же узел.

Далее в коде:

<xsl:value-of select="."/>

Поскольку . является корневым узломдля временного дерева вышеприведенная инструкция xslt создает строковое значение всего временного дерева, то есть объединение в порядке документа всех текстовых узлов в этом временном дереве.Это именно то, на что вы жалуетесь.

Решение :

Заменить :

<xsl:for-each select="msxsl:node-set($mergedData)"> 

на:

<xsl:for-each select="msxsl:node-set($mergedData)/*"> 

Теперь атрибут select xsl:for-each выбирает все New и Previous верхних элементов в дереве, как это, очевидно, и требовалось.

1 голос
/ 09 августа 2010
 <xsl:sort order="descending" select="substring(date,1,4)"/>
 <xsl:sort order="descending" select="substring(date,6,2)"/>
 <xsl:sort order="descending" select="substring(date,9,2)"/>

XML чувствителен к регистру. ссылка на «дату» должна соответствовать регистру ввода XML

Примечание: я предполагаю, что это

<xsl:variable name=">

это опечатка, а вы имели в виду

<xsl:variable name="mergedData">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...