Plone Web サイトのテーマ設定に Diazo/XSLT を使用しています。ホームページでは、Plone は次の構造を提供してくれます。
<dl>
<dt>
<a href="...">The news item title</a>
</dt>
<dd>
The content of the news item
</dd>
(and so on for the following ones)
</dl>
私はそのようなものに変換したい:
<div id="news_items">
<div>
<h2><a href="...">The news item title</a></h2>
The content of the news item.
<a class="readmore" href="<the HREF taken from the dt/a tag)">Read more</a>
</div>
(and so on for the following items)
</div>
私は XSLT と Diazo にあまり詳しくありません (既存のテーマのいくつかの部分を書き直すためによく使用されます) が、いくつかの解決策を試しました。
最初のものは、これを2回行うことでした。最初に各「dd」タグを探し、構造を作成し、その後すべての「dt」タグを解析して更新します。
<copy css:theme="#news_items">
<xsl:for-each css:select="#content-core dl dd">
<xsl:element name="div">
<xsl:element name="h2">
</xsl:element>
<xsl:copy-of select="./*" />
<xsl:element name="a">
<xsl:attribute name="class">readmore</xsl:attribute>
Read more
</xsl:element>
</xsl:element>
</xsl:for-each>
</copy>
構造は正しく作成されますが、2番目の部分の書き方がわかりません。アイデアは次のようになります。
<xsl:for-each css:select="#content-core dl dt">
<!-- Copy the link in the 'dd' tag into the h2 tag, based on the position -->
<copy css:theme="#news_item div:nth-child(position()) h2" css:select="a" />
<!-- Copy the a tag's href in the 'Read more' tag -->
<copy css:theme="#news_item div:nth-child(position()) a.readmore">
<xsl:attribute name="class">
<xsl:value-of select="@class" />
</xsl:attribute>
</copy>
</xsl:for-each>
あまり意味がないことはわかっていますが、次のことを理解していただければ幸いです。
各「dd」タグを調べます
ループ内の位置に基づいて、前のステップで作成された「h2」タグを見つけ、「dd」タグ内のリンクをコピーします。
(再び位置に基づいて)「a.readmore」タグを見つけ、href をコピーします。
私が考えていた 2 番目の解決策は、少し汚れています (どちらも機能しません)。アイデアは、1 つのステップでコンテンツを作成することです。
<xsl:for-each css:select="#content-core dl > *">
<xsl:if test="name = dt">
<!-- That the dt tag, we start the 'div' tag and add the h2 tag -->
</xsl:if>
<xsl:if test="name = dt">
<!-- That the dt tag, we copy the content and close the 'div' tag -->
</xsl:if>
</xsl:foreach>
しかし、私はその解決策が本当に好きではありません (そして、「もっと読む」リンクを作成する方法がわかりません)。
最初の解決策はできると思いますか? (特に、「h2」タグを設定し、「Read more」リンクに「href」属性を追加する 2 番目のステップ)。利用可能なより良い解決策はありますか?
私は Diazo のみを使用することを好みますが、それが不可能な場合は、Plone でビューを直接オーバーライドできます (これはより簡単だと思います。少なくとも私はその方法を知っています)。
ご協力いただきありがとうございます。