3

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>

あまり意味がないことはわかっていますが、次のことを理解していただければ幸いです。

  1. 各「dd」タグを調べます

  2. ループ内の位置に基づいて、前のステップで作成された「h2」タグを見つけ、「dd」タグ内のリンクをコピーします。

  3. (再び位置に基づいて)「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 でビューを直接オーバーライドできます (これはより簡単だと思います。少なくとも私はその方法を知っています)。

ご協力いただきありがとうございます。

4

1 に答える 1

2

この変換:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
     <div id="news_items">
      <xsl:apply-templates select="dt"/>
     </div>
 </xsl:template>

 <xsl:template match="dt">
  <div>
    <h2><xsl:copy-of select="a"/></h2>
    <xsl:apply-templates select="following-sibling::dd[1]"/>
    <a class="readmore" href="{a/@href}">Read more</a>
  </div>
 </xsl:template>
</xsl:stylesheet>

次の XML ドキュメントに適用した場合(提供されたものと同じ構造ですが、より多くの項目があります):

<dl>
    <dt>
        <a href="someUrl1">The news item1 title</a>
    </dt>
    <dd>
      The content of the news item1
  </dd>
    <dt>
        <a href="someUrl2">The news item2 title</a>
    </dt>
    <dd>
      The content of the news item2
 </dd>
</dl>

必要な正しい結果が生成されます

<div id="news_items">
   <div>
      <h2>
         <a href="someUrl1">The news item1 title</a>
      </h2>
      The content of the news item1
  <a class="readmore" href="someUrl1">Read more</a>
   </div>
   <div>
      <h2>
         <a href="someUrl2">The news item2 title</a>
      </h2>
      The content of the news item2
 <a class="readmore" href="someUrl2">Read more</a>
   </div>
</div>
于 2012-05-02T12:11:17.947 に答える