2016-04-19 9 views
0

Xpathを使用してXSLリストをソートしています。XPathカスタムソート式

年代順に並べ替えるのは簡単ですが、リスト項目の中には重複したタイトルがあり、新しいものであってもそれらをまとめて欲しいです。例えば:

リストアイテムA(4/19を作成)

(4/18を作成した)リスト項目B

重複リスト項目B(4/21を作成)

リスト項目C (作成された4/17)

- ここで重要な点は、最新のものであっても、「重複リストアイテムB」が元の下に表示されることです。

私の表現は、項目を降順で表示している「@Created」のみで構成されています。 「タイトルに「重複」という単語が含まれていない限り、アルファベット順にソートする」という表現が必要です。

これを実現するカスタムXpath式を提案できる人はいますか?

ありがとうございました。

EDIT:ここに「Xpath式を入力します」というウィンドウがあります。繰り返しますが、私は心配する必要がある唯一の2行は、私は仮定の多くを作るつもりで行くために、任意のコードがなければ@Titleと@ Created_x0020_Date

pic

+0

最初にグループ化してグループをソートし、各グループのアイテムを並べ替えます。 XSLT 2.0を使用していますか? –

+0

実際のXMLコンテンツを表示して、値の配置方法(テキスト、属性、親、子など)を表示してください。 – Parfait

+0

@Parfait私は生のXMLを持っていません。これは、あなたのためにXSLを構築するだけのsharepoint webpartの一部です。 まだこれは必要ありません。それは、リスト項目に作成日と件名の行があることです。私は、 "日付で並べ替え - 被写体に '重複'が含まれている場合を除いて、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> 

は基本的に私たちがここでやっていること@Created値によってソートされた個別の@label値に基づいて、各ブロックをループにキーを作成します。そこから、変数として現在の@labelを使用して各ブロックを再びループし、作成された日付でもう一度ソートします。

これは私に次のような出力が得られます。

<p>C - 20160417</p> 
<p>B - 20160418</p> 
<p>B - 20160421</p> 
<p>A - 20160419</p> 

は明らかにこれは非常に粗く、それが必要のようなテンプレートを使用しませんが、あなたは何を理解できるようにするためにうまくいけば、それは概念が十分に説明してあなた自身のコードに翻訳しています!

+0

+1。あなたがキーを設定しているので、 '' 'xsl:for-each select ="キー( 'labels '、@ label) ">' Muenchianのグループ分けで現在のグループにアクセスするテキストブックのアプローチに従います。 –

+0

ありがとう@マーティン・ホーネン、私はそれを行う簡単な方法がなければならないことを知っていた!あなたのコードで私の返信を更新します。 –

+0

うまくやった!助けてくれてありがとう。 –