2016-10-21 10 views
-1

<media>タグをスライドショーとして、一連の画像をインライン画像として扱うには、xsltが必要です。私は<media><p>タグで囲まれているが、すべて<media>タグ以外を扱うように拡張するのは面倒です。 xslt 1.0で動くnot(p)ロジックをどうやって書くことができますか?ここで一連の画像をスライドショーとして、単一画像をインライン画像として変換するにはどうすればよいですか?

は、XSLTは(それは重要ではありませんので、私は完全なコール・テンプレートのコードを削除しました)である:ここでは

<xsl:template name="textImage"> 
     <xsl:param name="paragraphs"/> 
     <xsl:variable name="paragraphCount" select="count($paragraphs)"/> 
     <xsl:for-each select="$paragraphs"> 
      <xsl:choose> 
       <xsl:when test="mediaReference"> 
        <xsl:choose> 
         <!--single media block--> 
         <xsl:when test="ancestor::table or position() = $paragraphCount or (position() = 1 and (generate-id(following-sibling::*[1]) != generate-id(following-sibling::media[1]))) or (generate-id(preceding-sibling::p[1]/following-sibling::media[1]) = generate-id(current()) and generate-id(following-sibling::p[1]/preceding-sibling::media[1]) = generate-id(current()))"> 
          <xsl:call-template name="imageNode"/> 
         </xsl:when> 
         <!--two more pam:media blocks for a carousel--> 
         <xsl:otherwise> 
          <xsl:choose> 
           <xsl:when test="generate-id(preceding-sibling::p[1]/following-sibling::media[1]) = generate-id(current())"> 
            <xsl:call-template name="firstImageNode"/> 
           </xsl:when> 
           <xsl:when test="generate-id(following-sibling::p[1]/preceding-sibling::media[1]) = generate-id(current())"> 
            <xsl:call-template name="lastImageNode"/> 
           </xsl:when> 
           <xsl:otherwise> 
            <xsl:call-template name="imageNode"/> 
           </xsl:otherwise> 
          </xsl:choose> 
         </xsl:otherwise> 
        </xsl:choose> 
       </xsl:when> 
       <xsl:otherwise> 
        <xsl:call-template name="textNode"/> 
       </xsl:otherwise> 
      </xsl:choose> 
     </xsl:for-each> 
    </xsl:template> 

は、いくつかのサンプルxmlです:

<?xml version="1.0" encoding="utf-8"?> 
<message> 
    <article xml:lang="en-US"> 
     <body> 
      <h2>What a Chicken!</h2> 
      <media> 
       <mediaReference refid="BA_chicken1.jpg"/> 
      </media> 
      <ol> 
       <li> 
        <p>Place chicken breast side down.</p> 
       </li> 
      </ol> 
      <media> 
       <mediaReference refid="BA_chicken2.jpg"/> 
      </media> 
      <media> 
       <mediaReference refid="BA_chicken3.jpg"/> 
      </media> 
      <p>More about chickens</p> 
      <media> 
       <mediaReference refid="BA_chicken4.jpg"/> 
      </media> 
      <p>The End</p> 
     </body> 
    </article> 
</message> 

正しい出力が何かを探しますlike:

<h2>What a Chicken!</h2> 
<img src="BA_chicken1.jpg"> 
<ol><li> 
    <p>Place chicken breast side down.</p> 
</li></ol> 
<div class="slideshow"> 
    <img src="BA_chicken2.jpg"> 
    <img src="BA_chicken3.jpg"> 
</div> 
<p>More about chickens</p> 
<img src="BA_chicken4.jpg"> 
<p>The End</p> 
+0

画像のロジックは何ですか?最初はすべて* slideshow * divに入っていますが?また、名前空間 'pam:'は使用する前に宣言しなければなりません。あなたはサンプルを投稿する際にそれを残しているかもしれません。 – Parfait

+0

pam名前空間はサンプルから除外されますが、マッチングにとって重要ではありません。私はスライドショーに2つのイメージの各グループを作成し、1つのイメージをインラインイメージとして残す必要があります。 –

答えて

1

おそらく、マッチテンプレートをうまく活用するアプローチが役立ちます。アイデンティティーテンプレートを使用する場合は、個人またはグループであるかどうかなど、さまざまな状況に合わせて別々のテンプレートを用意し、連続したものについては、一度に1つずつ連続した要素を処理する再帰テンプレートを使用します。

は、私はあなたのXSLTは、あなたの出力XMLがこれを示していないが、グループ内の最初と最後の要素を区別するために思われることに注意してください

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" xmlns:pam="pam"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:strip-space elements="*" /> 

    <!-- Ignore media elements with direct preceding siblings as these are processed elsewhere --> 
    <xsl:template match="pam:media[preceding-sibling::*[1][self::pam:media]]" priority="2" /> 

    <!-- First of a group --> 
    <xsl:template match="pam:media[following-sibling::*[1][self::pam:media]]"> 
     <div class="image"> 
      <xsl:apply-templates select="self::*" mode="image" /> 
     </div> 
    </xsl:template> 

    <!-- Individual --> 
    <xsl:template match="pam:media"> 
     <xsl:apply-templates select="self::*" mode="image" /> 
    </xsl:template> 

    <!-- Template that actually creates the image --> 
    <xsl:template match="pam:media" mode="image"> 
     <img src="{pam:mediaReference/@pam:refid}" /> 
     <xsl:apply-templates select="following-sibling::*[1][self::pam:media]" mode="image" /> 
    </xsl:template> 

    <!-- Identity Template --> 
    <xsl:template match="@*|node()" name="identity"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 

このXSLTを試してみてください。この回答を処理するための1つの方法は、「イメージ」モードテンプレートを修正して実行カウントを維持し、グループ内の最初のノードか最後のノードかをチェックできるようにすることです。

たとえば、この更新されたテンプレートは、最初と最後の要素までに別のクラスを追加します。

<xsl:template match="pam:media" mode="image"> 
    <xsl:param name="position" select="1" /> 
    <xsl:variable name="nextElement" select="following-sibling::*[1][self::pam:media]" /> 
    <img src="{pam:mediaReference/@pam:refid}"> 
     <xsl:attribute name="class"> 
     <xsl:choose> 
      <xsl:when test="$position = 1 and $nextElement">first image</xsl:when> 
      <xsl:when test="$position > 1 and not($nextElement)">last image</xsl:when> 
      <xsl:otherwise>image</xsl:otherwise> 
     </xsl:choose> 
     </xsl:attribute> 
    </img> 
    <xsl:apply-templates select="$nextElement" mode="image"> 
     <xsl:with-param name="position" select="$position + 1" /> 
    </xsl:apply-templates> 
</xsl:template> 
+0

グループの開始と終了を追跡して、スライドショーに正しい開閉を書き込む必要があります。論理を変更せず、多くの定型文を読み込むために、xsltからいくつかのノード書き込みを削除しました。 –

+0

更新テンプレートの名前付きテンプレートバージョンを作成しました。変数を使用して前後の要素に関する情報を格納できることを指摘してくれてありがとう。 –

関連する問題