我必须从此xml中的所有评论中按顺序排序前4条评论,(按date_added排序):
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="get7Comments.xsl"?>
<products>
<product id="1">
<comment id="1">
<username>admin1</username>
<text>nice</text>
<date_added>20.06.2005</date_added>
</comment>
<comment id="2">
<username>admin2</username>
<text>too nice</text>
<date_added>11.05.2005</date_added>
</comment>
</product>
<product id="2">
<comment id="1">
<username>admin1</username>
<text>comment1</text>
<date_added>19.05.2005</date_added>
</comment>
<comment id="2">
<username>daniel</username>
<text>comment2</text>
<date_added>06.05.2005</date_added>
</comment>
<comment id="3">
<username>another</username>
<text>comment3</text>
<date_added>15.05.2005</date_added>
</comment>
</product>
</products>
我想要的最后4条评论的输出示例:
admin1 : nice : 20.06.2005
admin1 : comment1 : 19.05.2005
another : comment3 : 15.05.2005
admin2 : too nice : 11.05.2005
如果我将它们作为项目列表 - 评论 - 让它们完美地工作,但是在我将它们分成新标签之后却不能
<product id=""> comments </product>
我无法对它们进行排序并先取下4.如果我没有“产品”标签,它是如何工作的,我的意思是所有的coments都有父产品标签:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8"/>
<xsl:template match ="products">
<xsl:for-each select="product[position() < 8]">
<xsl:sort select="normalize-space(substring(date_added,7,4))" order="descending" />
<xsl:sort select="normalize-space(substring(date_added,4,2))" order="descending" />
<xsl:sort select="normalize-space(substring(date_added,0,2))" order="descending" />
<xsl:variable name="commID" select="@id" />
<a href="index.php?p=comment&id={$commID}">
<xsl:value-of select="substring(text,0,60)" />
</a><br/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
不确定您要完全尝试做什么,但请尝试使用xsl:apply-templates
代替xsl:for-each
。
示例:
XSLT 1.0
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8"/>
<xsl:template match ="products">
<xsl:apply-templates select="product/comment">
<xsl:sort select="concat(
normalize-space(substring(date_added,7,4)),
normalize-space(substring(date_added,4,2)),
normalize-space(substring(date_added,1,2))
)" data-type="number" order="descending" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="comment">
<!--xsl:if used because it wasn't working on the predicate?-->
<xsl:if test="4 >= position()">
<a href="index.php?p=comment&id={@id}">
<xsl:value-of select="substring(text,1,60)" />
</a><br/>
<xsl:text>
</xsl:text>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
使用您的XML输入产生:
<a href="index.php?p=comment&id=1">nice</a><br>
<a href="index.php?p=comment&id=1">comment1</a><br>
<a href="index.php?p=comment&id=3">comment3</a><br>
<a href="index.php?p=comment&id=2">too nice</a><br>
如果您的产品中有重复的评论ID,则需要修改您的href(就像您在示例XML中一样)。
(编辑:错过了您正在尝试返回前4条评论。已修复。还修正了第3个substring()
中的拼写错误。)