XPath自定义排序表达式

时间:2016-04-19 19:32:55

标签: xml sorting xslt xpath

我正在使用Xpath对XSL列表进行排序。

我想按时间顺序排序,这很容易 - 但是有些列表项目有重复的标题,我希望这些标题组合在一起,即使它们更新。例如:

列出项目A(创建4/19)

列出项目B(创建4/18)

重复列表项B(创建4/21)

列出项目C(创建4/17)

- 这里的关键是确保"重复列表项B"尽管它是最新的,但它仍然出现在原版之下。

现在,我的表达只包含" @ Created"它以降序显示项目。我需要一个表达式"按创建日期排序,除非标题包含单词' duplicate' - 在这种情况下,按字母顺序排序"

有人可以提出实现此目的的自定义Xpath表达式吗?

感谢。

编辑:这是窗口,其中'我输入Xpath表达式。同样,我需要担心的只有2行是@Title和@ Created_x0020_Date

pic

1 个答案:

答案 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>

显然这非常粗糙,并且没有像它应该使用的模板,但希望它能够很好地解释这些概念,以便您能够理解正在发生的事情并将其转换为您自己的代码!