2016-04-19 56 views
0

我正在使用Xpath排序XSL列表。XPath自定義排序表達式

我想按時間順序排序,這是easy--但一些列表項有重複的標題,我想這些組合在一起,即使是新的。例如:

列表項A(創建4/19)

列表項B(創建4/18)

重複列表項B(創建4/21)

列表項C (創建4/17)

這裏--the關鍵是確保「複製列表項B」出現原來之下,即使它是最新的。

現在,我的表情只由「@Created」,這是顯示在降序排列的項目。我需要的,上面寫着「按創建日期,除非標題包含單詞‘複製’ - 在這種情況下,那些排序按字母順序」的表達

任何人都可以提出一個自定義的XPath表達式實現這一點?

謝謝。

編輯:這裏是」我進入XPath表達式窗口。同樣,只有2行我需要擔心的是@Title和@ Created_x0020_Date

pic

+0

第一組和排序組,然後對每個組中的項目進行排序。你使用XSLT 2.0嗎? –

+0

請出示實際的XML內容,以幫助查看值如何放置(文本,屬性,父母,子女等) – Parfait

+0

@Parfait我沒有原始的XML。這是sharepoint webpart的一部分,它只是爲您構建XSL。 仍然 - 這應該不是真的有必要。它所涉及的是列表項目包含創建日期和主題的行。我只需要一個Xpath表達式,表示「按日期排序 - 除非主題包含'重複',在這種情況下按字母順序排序。」 –

回答

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> 

顯然,這是非常粗糙的,並且不使用模板,像它應該,但希望它很好地解釋了的話,你要能夠理解的概念正在進行並將其翻譯成您自己的代碼!

+0

+1。當您設置密鑰時,''應該簡單地爲'」按照教科書的方式使用Muenchian分組訪問當前組。 –

+0

謝謝@ martin-honnen,我知道必須有一個更簡單的方法來做到這一點!我會用你的代碼更新我的回覆。 –

+0

很好地完成了!謝謝大家的幫助。 –