我正在尝试从通过PHP解析的CSV文件中对数据进行排序。 PHP获取数据并将其转换为XML,然后由XSL样式表格式化。数据包含IP地址,日期和用户代理。 XSL按IP地址对数据进行分组,我也需要按IP地址进行排序。
这是我的XSL代码:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version = "1.0" xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="group-by-ipaddress" match="row" use="ipaddress" />
<xsl:template match="rows">
<html>
<body>
<xsl:for-each select="row[count(. | key('group-by-ipaddress', ipaddress)[1]) = 1]">
<xsl:sort select="ipaddress"/>
<p>IP Address: <xsl:value-of select="ipaddress"/></p>
<xsl:for-each select="key('group-by-ipaddress', ipaddress)">
<xsl:sort select="date" />
<p><blockquote>Date: <xsl:value-of select="date"/> : <xsl:value-of select="userAgent"/></blockquote></p>
</xsl:for-each>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
它将一切都很好,但排序并不是很有效。排序工作直到最后一个IP地址,从5开始。那个应该是排序中的第一个,但由于某种原因它是最后一个。这是我得到的输出:有什么建议吗?
IP地址:12.22.333.44
Date: 2013-01-02 : http://www.zorro.com
IP地址:123.33.44.55
Date: 2013-01-03 : Mozilla/5.0 (Windows NT 6.1; rv:27.0) Gecko/20100101 Firefox/27.0
Date: 2013-01-03 : Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Date: 2013-01-06 : Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Date: 2013-01-07 : Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
IP地址:212.38.44.55
Date: 2013-01-02 : Mozilla/3.0 (x86 [en] Windows NT 5.1; Sun)
Date: 2013-01-06 : Mozilla/3.0 (x86 [en] Windows NT 5.1; Sun)
IP地址:256.19.44.55
Date: 2013-01-06 : Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
IP地址:5.255.23.25
Date: 2013-02-02 : Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)
Date: 2013-02-05 : Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)
答案 0 :(得分:2)
您在此处对IP地址进行字母排序,并在12.22.333.44
之前5.255.23.25
按字母顺序排列。如果你想对它们进行适当的排序,它就不会那么漂亮了:
<xsl:for-each select="row[count(. | key('group-by-ipaddress', ipaddress)[1]) = 1]">
<xsl:sort select="substring-before(ipaddress, '.')"
data-type="number"/>
<xsl:sort select="substring-before(
substring-after(ipaddress, '.'), '.')"
data-type="number"/>
<xsl:sort select="substring-before(
substring-after(
substring-after(ipaddress, '.'), '.'), '.')"
data-type="number"/>
<xsl:sort select="substring-after(
substring-after(
substring-after(ipaddress, '.'), '.'), '.')"
data-type="number"/>
<!-- Contents of for-each -->
</xsl:for-each>