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

3

I have an xml as follows

<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, COMPLETED} 进行排序呢?
感谢您的回复!

1
可能需要使用XSL标签。这样你会更容易得到回复。 - undefined
@Rick: [xsl] 会自动映射为[xslt]。 - undefined
@Jongware:在我评论的时候,它只被标记为[sorting]。 - undefined
1个回答

0

xsl:sort行中,您可以使用translate函数将字符串"ASSIGNED"、"EXPIRED"和"COMPLETED"的第一个字符转换为简单的"1"、"2"、"3"。由于您的字符串的第一个字符是唯一的,所以只要这样做就足够了;如果有两个以"A"开头的字符串,那就更难了。

下面的示例强制使用硬编码的<feed>(因为模板匹配本身会移除它),并对所有其他元素使用身份变换。

<?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>

谢谢 Jongware,非常顺利!请问如果这些标题共享相同的首字母怎么办?比如 ASSGN、ASSXP、ASSGP,我想按照 {ASSXP、ASSGN、ASSGP} 的顺序进行排序。 - undefined
对于无法轻松转换为数字的较大范围的字符串,就像这里一样,我可能会逐个单词使用select="entry[.='ASSXP']",并按正确顺序进行操作。(根据记忆;确切的语法可能需要一些调整。) - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接