まず、XMLに目を向けて、レッスンのリストを作成すると同時に、1つのレッスンに関する情報の完全な出力を担当するセクションを少し修正しました。
Copy Source | Copy HTML<br/> <!-- lesson_id --> <br/> <br/> < newt:include match ="query[lesson_id/@value='' or not(lesson_id)]"> <br/> < newt:base id ="lessons-list" add-query ="lessons-list" query-filter ="lesson_id"> <br/> < request > <br/> < get limit ="20" object ="lesson" sort ="sort"> <br/> < info attr ="shortdescription"/> <br/> </ get > <br/> </ request > <br/> </ newt:base > <br/> </ newt:include > <br/> <br/> <!-- lesson_id --> <br/> <br/> < newt:include match ="query[lesson_id/@value!='']"> <br/> < newt:base id ="lessons-list" add-query ="lessons-list" query-filter ="lesson_id"> <br/> < request > <br/> < get limit ="20" object ="lesson" sort ="sort"> <br/> < info attr ="description"/> <br/> </ get > <br/> </ request > <br/> </ newt:base > <br/> </ newt:include > <br/>
Get'omでは、20を超えない量のレッスンを選択し、さらにInfoで全文を選択します。 まだ20を超える必要はありません。 明確にするために、リストのデータサンプリングとnewt:includeを介した完全な出力のこのような実装を指定しました。これにより、より明確になります(実際、これを行う方法は多数あります)。 テキストから、1つのセクションはリスト用であり、2番目のセクションは全文用であることは明らかです。 実際のシステムでは、すべてが多少簡潔に記述されています。
現在、最も重要な機能はオブジェクトの展開可能性です。 彼女は、前のレッスンと次のレッスンを選択するために、私たちにいくつかの複雑な行動を強制することはないという事実で、ここで私たちを助けます。 getを使用し、id(つまりid)に追加の制限を指定しない場合、この方法でデプロイ可能性の概念を使用できます。 クエリ(この場合、URLを介したパラメーターとして)でlesson_idパラメーターを渡し、このパラメーターをnewt:baseおよびget命令にスキップすると、この命令は特別な方法で動作します:展開(つまり、オブジェクトの完全なデータとinfoなどのネストされた命令はすべて、渡されたIDと一致するIDを持つオブジェクトのみです。 残りのオブジェクトは、デプロイの前後にXMLの短いレコードとして単純に記録されます。
つまり lesson_id = 85の場合の出力は次のようになります。
Copy Source | Copy HTML<br/> < base id ="lessons-list" add-query ="lessons-list" ... > <br/> < lesson id ="83" query ="&lesson_id=83" title =" 1: "/> <br/> < lesson id ="84" query ="&lesson_id=84" title =" 2: "/> <br/> < lesson id ="85" query ="&lesson_id=85" title =" 3: "> <br/> < description > <br/> ...<br/> </ description > <br/> </ lesson > <br/> < lesson id ="86" query ="&lesson_id=86" title =" 4: "/> <br/> < lesson id ="87" query ="&lesson_id=87" title =" 5: "/> <br/> < lesson id ="88" query ="&lesson_id=88" title =" 6: "/> <br/> </ base > <br/>
次に、XSLT変換でこのXMLを適切に処理する必要がありますが、これは簡単です。 レッスンのテキストの下で、後で作成した目的のテンプレートを呼び出します。
Copy Source | Copy HTML<br/> < xsl:template match ="lesson[description]"> <br/> ...<br/> ...<br/> < xsl:apply-templates select ="." mode ="pagelisting"/> <br/> </ xsl:template > <br/> <br/> < xsl:template match ="lesson[description]" mode ="pagelisting"> <br/> < p style ="text-align: center;"> <br/> < xsl:if test ="preceding-sibling::lesson[1]"> <br/> < a href ="/docs.xml?lesson_id={preceding-sibling::lesson[1]/@id}">< xsl:value-of select ="preceding-sibling::lesson[1]/@title"/></ a > <br/> </ xsl:if > <br/> < xsl:if test ="preceding-sibling::lesson[1] and following-sibling::lesson[1]"> | </ xsl:if > <br/> < xsl:if test ="following-sibling::lesson[1]"> <br/> < a href ="/docs.xml?lesson_id={following-sibling::lesson[1]/@id}">< xsl:value-of select ="following-sibling::lesson[1]/@title"/></ a > <br/> </ xsl:if > <br/> </ p > <br/> </ xsl:template > <br/>
テンプレート自体では、軸(先行兄弟と後続兄弟)を使用し、要素番号の表示([1])を使用して、必要なものを示します。これは、1つの要素だけを前に戻し、1つの要素のみを戻すためです。 これは純粋なXSLTであり、モーツァルトのプリブルダはありません。