2011-08-15 7 views
1

タイトルに基づいてソートされた記事のリストを取得しました。 「メイン」のタイトルに加えて、記事には別のタイトルが付いている場合があります(さらには複数のタイトルもあります)。記事に別のタイトルがある場合、記事はタイトルの数だけ表示されるはずです(メインタイトルの記事と2つの代替タイトルはリストに3つのエントリを入れる必要があります)。このフォーラムでSimon Christianがこれを解決する解決策を投稿しました(ありがとう)、私は希望のリストを手に入れることができました。apply-templatesの結果をfor-each-group(または問題の別の解決策)と組み合わせる

ただし、このソリューションを拡張する必要があります。リストに加えて、私はジャンプメニューが必要です。だから、私は各タイトルの最初の文字(代替タイトルを含む)を抽出し、これらの文字を取り出してリストの先頭に表示する必要があります。各文字は、ページ上のアンカーへのリンクです。リストには、最初に文字 'A'が表示され、続いて 'A'で始まるすべての記事、 'B'で始まるすべての記事、 'B'で始まるすべての記事などが表示されます。タイトルの最初の文字ではない文字は表示しないでください。

私はジャンプメニューの取得方法については古い解決策がありますが、ソースXMLの1か所からタイトルを抽出する必要がある場合にのみ機能します。代替タイトルは、メインタイトルよりも2レベルほど深いものです。私が使用した古い解決法では、私は次のように使用しました:

<div class="jumpmenu"> 
    <xsl:for-each-group group-by="substring(title, 1,1)" select="content"> 
    <xsl:sort order="ascending" select="substring(title, 1,1)"/> 
    <a href="{$url}#{substring(title, 1,1)}"><xsl:value-of select="substring(title, 1,1)"/></a><xsl:text> </xsl:text> 
    </xsl:for-each-group> 
</div> 

しかし、上記のように、別のタイトルを考慮しません。私はこれを使って、(代替案を含む)すべてのタイトルの最初の文字を取得することができるよ:

<xsl:apply-templates select="content/title|content/contentdata/alternativetitles/alternativetitle" mode="jumpmenu"> 
    <xsl:sort select="string(.)" />    
</xsl:apply-templates> 

それは基本的には全てのタイトルの最初の文字を取得し、それらを並べ替えます。私はこれらの2つを組み合わせる方法を見つけようとしましたが(それぞれのグループと適用テンプレート用)、運がありません。これを行う方法に関するアイデア。例えば次のように元のXMLは次のとおりです。

<result> 
    <element> 
    <title>ATitle 1</title> 
    <alternative> 
     <alternativeTitle>Title 5<alternativeTitle> 
    </alternative> 
    <data> 
     ... 
    </data> 
    </element> 

    <element> 
    <title>CTitle 3</title> 
    <alternative> 
     <alternativeTitle>BTitle 2<alternativeTitle> 
     <alternativeTitle>Title 4<alternativeTitle> 
    </alternative> 
    <data> 
     ... 
    </data> 
    </element> 
</result> 

私の所望の出力は、何かのようである:

A B C T   (links to their respective anchors) 
A   (anchor) 
ATITLE 1 (which is also a link to the full article) 
B   (anchor) 
BTITLE 2 (which is also a link to the full article) 
C   (anchor) 
CTITLE 3 (which is also a link to the full article) 
T   (anchor) 
TITLE 4 (which is also a link to the full article) 
TITLE 5 (which is also a link to the full article) 

これに対する解決策は、おそらく別の問題で私を助けますが、誰もが持っている場合、私はそれを紹介しますそれのためのアイデアも。代替タイトルを持つ記事は、メインタイトルの最初の文字と同じ文字の下にリストされます。上の例では、 "BTitle 2"は "C"の下に表示されています。

長いポストに申し訳ありませんが、私はそれを短くしても正確にする方法はありませんでした。あらかじめ、ありがとう!

EDIT:この私が問題の第二部に、これまで持っていたコード:コードはすべてのタイトルを一覧表示されます

<xsl:for-each-group group-by="substring(title, 1,1)" select="content"> 
    <xsl:sort order="ascending" select="substring(title, 1,1)"/> 
    <xsl:apply-templates mode="overskrift" select="."/> 
    <xsl:apply-templates select="current-group()/title|current-group()/contentdata/alternativetitles/alternativetitle"> 
    <xsl:sort select="string(.)"/> 
    </xsl:apply-templates> 
</xsl:for-each-group> 

が、同じ最初の文字に基づいて代替タイトルを一覧表示します記事のメインタイトル...

答えて

1

さて、なぜあなたは単に

<xsl:for-each-group select="content/title|content/contentdata/alternativetitles/alternativetitle" group-by="substring(., 1, 1)"> 
    <xsl:sort select="current-grouping-key()"/> 
    <a href="{$url}#{current-grouping-key()}"><xsl:value-of select="current-grouping-key()"/></a><xsl:text> </xsl:text> 

</xsl:for-each-group> 

を使用していませんか?あなたは、そのコンテンツ要素の親と一致するテンプレートにそのコードを置くべきです(私はあなたのパス式としてどの名前を持っているのか分からず、投稿されたXMLサンプルが一致しません)。

+0

これは機能しているようです。ありがとう! :) group-byを "。"で使用することを考えなかった現在のグループ化キーでソートしてください。いいです!私はまだ私の問題の2番目の部分の解決策を見つけるのにいくつかの問題を抱えています。あなたもそれを見てみることができますか? – pecka85

関連する問題