xsl合并元素并按日期排序

时间:2010-08-09 16:28:40

标签: xml xslt merge

我有以下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 个答案:

答案 0 :(得分:3)

  

似乎没有按日期排序   它给了我一块代码我   需要按日期排序   能够操纵数据,所以我可以   它们在表格行中。

     

喜欢这个。

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

,代码(如果正确)将输出最大New的{​​{1}}或Previous元素之一的字符串值。< / p>

以下是您的代码中的主要问题

date

<xsl:for-each select="msxsl:node-set($mergedData)"> 扩展函数返回文档树 - 不是顶级元素或XML片段。换句话说,它返回此文档树的根节点:msxsl:node-set()

因此,上面的/仅选择一个节点,此节点的子元素仅为<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-eachNew个顶部元素,这显然是需要的。

答案 1 :(得分:1)

 <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区分大小写。对“date”的引用需要与输入XML

的大小写相匹配

注意:我假设这个

<xsl:variable name=">

是一个错字,你的意思是

<xsl:variable name="mergedData">