XSLT - 按自定义字符串集排序

时间:2014-07-11 10:52:28

标签: sorting xslt

我有一个xml如下

<feed>
  <entry>
    <id>4</id>
    <updated>2012-11-18T16:55:54Z</updated>
    <title>ASSIGNED</title>
  </entry>
  <entry>
    <id>3</id>
    <updated>2011-01-16T16:55:54Z</updated>
    <title>ASSIGNED</title>
  </entry>
  <entry>
    <id>2</id>
    <updated>2014-12-01T16:55:54Z</updated>
    <title>EXPIRED</title>
  </entry>
  <entry>
    <id>1</id>
    <updated>2013-01-12T16:55:54Z</updated>
    <title>COMPLETED</title>
  </entry>
  <entry>
    <id>1</id>
    <updated>2012-01-09T16:55:54Z</updated>
    <title>ASSIGNED</title>
  </entry>
  <entry>
    <id>1</id>
    <updated>2011-04-18T16:55:54Z</updated>
    <title>COMPLETED</title>
  </entry>
</feed>

我想首先用ASSIGNED排序,然后是EXPIRED,然后是COMPLETED。 如果每个类别中都有多个条目,我希望按更新值降序排序。

我可以使用xsl:sort按更新降序排序,但如何根据订单中的一组字符串{ASSIGNED,EXPIRED,COM​​PLETED}进行排序

感谢您的回复!

1 个答案:

答案 0 :(得分:0)

您可以使用translate行中的xsl:sort将字符串“ASSIGNED”,“EXPIRED”和“COMPLETED”的第一个字符转换为简单的“1”,“2”, “3”。由于你的字符串的第一个字符是唯一的,所以它只需要;如果有两个以“A”开头的字符串会更难。

以下示例强制硬编码<feed>(因为模板匹配本身会将其删除)并对所有其他元素使用Identity Transform。

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/feed">
    <feed>
    <xsl:apply-templates select="entry">
        <xsl:sort select="translate (title, 'AaEeCc', '112233')" />
        <xsl:sort select="updated" />
    </xsl:apply-templates>
    </feed>
</xsl:template>

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

</xsl:stylesheet>