xml - 使用 XSLT 对 IP 地址进行排序

标签 xml sorting xslt

我正在尝试对通过 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)

最佳答案

您在这里对 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>

关于xml - 使用 XSLT 对 IP 地址进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22870877/

相关文章:

xml - Scala - 修改 xml 中的嵌套元素

c++ - 按字母顺序对 vector<Struct> 进行排序

python - 数字对包含数字和字符串的列进行排序 (pandas/python)

C# 按多列对多维数组进行排序

xslt - 如何使用 xslt 从此 xml 中获取最后一行数据

java - 如何使用 Reflection API 查找字段变量或方法 - Java

java - 如何在 Java 中使用 XmlPullParser 解析 XML 字符串?

java - 使用 Xstream 是可能的序列化方法吗?

xslt - xsl 每个不使用 XSLT 1.0 更新所有值

javascript - 窗口调整大小条件