我有以下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
答案 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-each
和New
个顶部元素,这显然是需要的。
答案 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">