我正在使用Xpath对XSL列表进行排序。
我想按时间顺序排序,这很容易 - 但是有些列表项目有重复的标题,我希望这些标题组合在一起,即使它们更新。例如:
列出项目A(创建4/19)
列出项目B(创建4/18)
重复列表项B(创建4/21)
列出项目C(创建4/17)
- 这里的关键是确保"重复列表项B"尽管它是最新的,但它仍然出现在原版之下。
现在,我的表达只包含" @ Created"它以降序显示项目。我需要一个表达式"按创建日期排序,除非标题包含单词' duplicate' - 在这种情况下,按字母顺序排序"
有人可以提出实现此目的的自定义Xpath表达式吗?
感谢。
编辑:这是窗口,其中'我输入Xpath表达式。同样,我需要担心的只有2行是@Title和@ Created_x0020_Date答案 0 :(得分:1)
如果没有任何代码可以继续,我会做出很多假设。给出以下XML块:
<data>
<block created="20160419" label="A"/>
<block created="20160418" label="B"/>
<block created="20160421" label="B"/>
<block created="20160417" label="C"/>
</data>
您需要使用密钥才能使其正常工作。我假设XSLT 1.0,因为它将与您使用的任何一个兼容。
<xsl:key name="labels" match="/data/block" use="@label" />
<xsl:template match="/">
<html lang="en">
<head></head>
<body>
<xsl:for-each select="/data/block[generate-id(.) = generate-id(key('labels', @label))]">
<xsl:sort select="@created" data-type="number"/>
<xsl:for-each select="key('labels', @label )">
<xsl:sort select="@created" data-type="number"/>
<p><xsl:value-of select="@label"/> - <xsl:value-of select="@created"/></p>
</xsl:for-each>
</xsl:for-each>
</body>
</html>
</xsl:template>
基本上我们在这里做的是创建一个键,根据不同的@label值循环遍历每个块,并按@created值排序。从那里开始,使用当前的@label作为变量再次遍历每个块,并按创建日期再次排序。
这给了我以下输出:
<p>C - 20160417</p>
<p>B - 20160418</p>
<p>B - 20160421</p>
<p>A - 20160419</p>
显然这非常粗糙,并且没有像它应该使用的模板,但希望它能够很好地解释这些概念,以便您能够理解正在发生的事情并将其转换为您自己的代码!