【发布时间】:2010-05-17 11:35:38
【问题描述】:
我想要一个列表排序,忽略任何初始定冠词“the”和“a”。例如:
- 错误喜剧
- 哈姆雷特
- 仲夏夜之梦
- 第十二夜
- 冬天的故事
我认为也许在 XSLT 2.0 中这可以通过以下方式实现:
<xsl:template match="/">
<xsl:for-each select="play"/>
<xsl:sort select="if (starts-with(title, 'A ')) then substring(title, 2) else
if (starts-with(title, 'The ')) then substring(title, 4) else title"/>
<p><xsl:value-of select="title"/></p>
</xsl:for-each>
</xsl:template>
但是,我想使用浏览器内处理,所以必须使用 XSLT 1.0。有没有办法在 XLST 1.0 中实现这一点?
【问题讨论】:
-
通常正确的方法是为每个元素存储一个“排序标题”,因为规则可能变得非常复杂,甚至扩展到其他语言(例如“Die”是一篇文章,应该在德语中被忽略,但“Die Hard”不应该在“H”下排序,即使在德语索引中找到)。 “仲夏夜之梦”的排序标题将是“仲夏夜之梦,A”。
-
我应该提到,starts-with() 在 XLST 1.0 中可用,但 if-then-else 不是...
-
@Joachim - 你说得对,但我需要处理现有数据,没有资源来维护并行排序字段; Gart 的 quick-n-dirty 解决方案正是我所需要的——不过评论很好
-
好问题! (+1)。请参阅我的答案以获得完整的解决方案。