【问题标题】:Sort XML by RFC-822 date format using XSL使用 XSL 按 RFC-822 日期格式对 XML 进行排序
【发布时间】:2013-02-23 01:08:00
【问题描述】:

有人知道在 XSL 中进行这种排序的方法吗?

这是我到目前为止的内容,但它只按天排序,而忽略了日期的其余部分。

      <xsl:apply-templates select="item">
          <xsl:sort select="pubDate" data-type="text" order="descending"/>
      </xsl:apply-templates>

【问题讨论】:

  • 日期只是日期还是日期时间?您使用的是 XSLT 1.0 还是 XSLT 2.0?您还可以编辑发布您的 XML 的答案吗?
  • 这当然是可能的,但并非微不足道。您必须在 XSLT 中编写一个解析器,将 RFC-822 日期转换为可排序的东西。我会使用 EXSLT 函数和 XPath 字符串函数。

标签: xml xslt rfc822


【解决方案1】:

感谢大家的快速回复。让我朝着正确的方向前进。设法解决它!找到一个有用的链接http://blog.mastykarz.nl/how-to-do-it-rss-aggregation-merging-multiple-xml-files-using-xslt/

我使用的是 XSLT 2.0 版。只是一个使用变量替换 MMM 月份并将日期子串下来的案例。

解决方案

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="Months" select="'Jan;Feb;Mar;Apr;May;Jun;Jul;Aug;Sep;Oct;Nov;Dec'"/>

<xsl:template match="@*|node()">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()" />
    </xsl:copy>
</xsl:template>

<xsl:template match="channel">
    <xsl:copy>
        <xsl:apply-templates select="@*|node()[not(preceding-sibling::item) and not(self::item)]"/>
        <xsl:apply-templates select="item">
            <!-- year -->
        <xsl:sort select="substring(pubDate, 13, 4)" order="descending" data-type="number"/>
        <!-- month -->
        <xsl:sort select="string-length(substring-before($Months, substring(pubDate, 9, 3)))" order="descending" data-type="number"/>
        <!-- day -->
        <xsl:sort select="substring(pubDate, 6, 2)" order="descending" data-type="number"/>
        <!-- hour -->
        <xsl:sort select="substring(pubDate, 18, 2)" order="descending" data-type="number"/>

        </xsl:apply-templates>
        <xsl:apply-templates select="@*|node()[not(following-sibling::item) and not(self::item)]"/>
</xsl:copy>
</xsl:template>

【讨论】:

  • 这个解决方案看起来很脆弱,因为它假设日期时间元素总是在字符串中的相同位置。这不一定是真的。例如,日期时间开始处的星期几是可选的。此外,可以使用一位或两位数字指定月份中的某天。
  • @nwellnhof 如果他们使用 RFC-822 日期,那不应该是真的。我假设 OP 正在使用 RSS 提要,并且为了验证它,pubDate 有非常严格的要求。现在,确实 pubDate 不必采用格式,但它确实需要验证。
猜你喜欢
  • 2011-04-22
  • 2013-06-15
  • 2010-12-23
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 2018-12-06
  • 2017-07-19
  • 1970-01-01
相关资源
最近更新 更多