2012-01-05 119 views
1

林想有大約每三個元素的容器 - 但是,斜面完全得到它的工作,我嘗試做這樣的:行每隔3個元素

<xsl:when test="$type != ''"> 
      <xsl:variable name="query" select="$currentPage/* [@isDoc and string(umbracoNaviHide) != '1' and type = $type ]"/> 
      <xsl:if test="count($query) &gt; 0"> 
       <section class="brochures-{$section-css-name}"> 
        <xsl:choose> 
         <xsl:when test="$section-css-name = 'portrait' or region = $region"> 
          <h2>Business</h2> 
         </xsl:when> 
         <xsl:when test="$section-css-name = 'landscape' or region = $region"> 
          <h2>Panorama</h2> 
         </xsl:when> 
         <xsl:when test="$section-css-name = 'quadrat' or region = $region"> 
          <h2>Image</h2> 
         </xsl:when> 
        </xsl:choose> 
        <xsl:if test="position() = 1 or position() mod 3 = 0 "> 
         <div class="row"> 
          <div class="case-shadow">&nbsp;<xsl:comment/> 
          </div> 
          <xsl:for-each select="$query"> 
           <xsl:variable name="externalUrl" select="externalUrl"/> 
           <xsl:if test="$externalUrl != ''"> 
            <article class="brochure"> 
             <a href="{$externalUrl}/MailView/" target="_blank" class="replaceURL"> 
              <xsl:if test="$type = 60"> 
               <img src="{$externalUrl}/MailView/pagedata/frontpage.jpg" width="160" height="228" alt="" class="reflect"/> 
              </xsl:if> 
              <xsl:if test="$type = 61"> 
               <img src="{$externalUrl}/MailView/pagedata/frontpage.jpg" width="228" height="160" alt="" class="reflect"/> 
              </xsl:if> 
              <xsl:if test="$type = 62"> 
               <img src="{$externalUrl}/MailView/pagedata/frontpage.jpg" width="160" height="160" alt="" class="reflect"/> 
              </xsl:if> 
              <p> 
               <xsl:value-of select="headline"/> 
              </p> 
             </a> 
            </article> 
           </xsl:if> 
          </xsl:for-each> 
         </div> 
        </xsl:if> 
       </section> 
      </xsl:if> 
     </xsl:when> 

我想的輸出在HTML是:

<section class="brochures-portrait"> 
<h2>Business</h2> 
<div class="row"> 
    <div class="case-shadow">&nbsp;<!----></div> 
    <article class="brochure"> 
    </article> 
    <article class="brochure"> 
    </article> 
    <article class="brochure"> 
    </article> 
</div> 
<div class="row"> 
<div class="case-shadow">&nbsp;<!----></div> 
    <article class="brochure"> 
    </article> 
    <article class="brochure"> 
    </article> 
</div> 
</section> 

但是,我只拿到1左右我所有的小冊子小號:(


好,THX,但是我沒有放棄Ë知道如何整合與此:

<xsl:template match="/"> 
    <xsl:variable name="chosenregion"> 
     <xsl:value-of select="umbraco.library:RequestQueryString('region')"/> 
    </xsl:variable> 
    <xsl:if test="$currentPage/showRegionNavgation = '1'"> 
     <nav class="region-sort"> 
      <ul> 
       <li class="grey-gradient"> 
        <xsl:if test="$chosenregion = ''"> 
         <xsl:attribute name="class">selected</xsl:attribute> 
        </xsl:if> 
        <a href="?">All</a> 
       </li> 
       <li class="grey-gradient"> 
        <xsl:if test="$chosenregion = '76'"> 
         <xsl:attribute name="class">selected</xsl:attribute> 
        </xsl:if> 
        <a href="?region=76">North</a> 
       </li> 
       <li class="grey-gradient"> 
        <xsl:if test="$chosenregion = '77'"> 
         <xsl:attribute name="class">selected</xsl:attribute> 
        </xsl:if> 
        <a href="?region=77">Mid</a> 
       </li> 
       <li class="grey-gradient last"> 
        <xsl:if test="$chosenregion = '78'"> 
         <xsl:attribute name="class">selected</xsl:attribute> 
        </xsl:if> 
        <a href="?region=78">South</a> 
       </li> 
      </ul> 
     </nav> 
    </xsl:if> 

    <xsl:call-template name="brochure"> 
     <xsl:with-param name="type">60</xsl:with-param> 
     <xsl:with-param name="region"> 
      <xsl:value-of select="umbraco.library:RequestQueryString('region')"/> 
     </xsl:with-param> 
     <xsl:with-param name="section-css-name">portrait</xsl:with-param> 
    </xsl:call-template> 
    <xsl:call-template name="brochure"> 
     <xsl:with-param name="type">61</xsl:with-param> 
     <xsl:with-param name="region"> 
      <xsl:value-of select="umbraco.library:RequestQueryString('region')"/> 
     </xsl:with-param> 
     <xsl:with-param name="section-css-name">landscape</xsl:with-param> 
    </xsl:call-template> 
    <xsl:call-template name="brochure"> 
     <xsl:with-param name="type">62</xsl:with-param> 
     <xsl:with-param name="region"> 
      <xsl:value-of select="umbraco.library:RequestQueryString('region')"/> 
     </xsl:with-param> 
     <xsl:with-param name="section-css-name">quadrat</xsl:with-param> 
    </xsl:call-template> 
</xsl:template> 
<xsl:template name="brochure"> 
    <xsl:param name="type"/> 
    <xsl:param name="section-css-name"/> 
    <xsl:param name="region"/> 
    <xsl:choose> 
     <xsl:when test="$region != ''"> 
      <xsl:variable name="query" select="$currentPage/* [@isDoc and string(umbracoNaviHide) != '1' and type = $type and region = $region ]"/> 
      <xsl:if test="count($query) &gt; 0"> 
       <section class="brochures-{$section-css-name}"> 
        <xsl:choose> 
         <xsl:when test="$section-css-name = 'portrait' or region = $region"> 
          <h2> 
           <xsl:value-of select="umbraco.library:GetDictionaryItem('Business')"/> 
          </h2> 
         </xsl:when> 
         <xsl:when test="$section-css-name = 'landscape' or region = $region"> 
          <h2> 
           <xsl:value-of select="umbraco.library:GetDictionaryItem('Panorama')"/> 
          </h2> 
         </xsl:when> 
         <xsl:when test="$section-css-name = 'quadrat' or region = $region"> 
          <h2> 
           <xsl:value-of select="umbraco.library:GetDictionaryItem('Image')"/> 
          </h2> 
         </xsl:when> 
        </xsl:choose> 
        <div class="case-shadow">&nbsp;<xsl:comment/> 
        </div> 
        <xsl:for-each select="$query"> 
         <xsl:variable name="externalUrl" select="externalUrl"/> 
         <xsl:if test="$externalUrl != ''"> 
          <article class="brochure"> 
           <a href="{$externalUrl}/MailView/" target="_blank" class="replaceURL"> 
            <xsl:if test="$type = 60"> 
             <img src="{$externalUrl}/MailView/pagedata/frontpage.jpg" width="176" height="248" alt="" class="reflect"/> 
            </xsl:if> 
            <xsl:if test="$type = 61"> 
             <img src="{$externalUrl}/MailView/pagedata/frontpage.jpg" width="242" height="170" alt="" class="reflect"/> 
            </xsl:if> 
            <xsl:if test="$type = 62"> 
             <img src="{$externalUrl}/MailView/pagedata/frontpage.jpg" width="176" height="175" alt="" class="reflect"/> 
            </xsl:if> 
            <p> 
             <xsl:value-of select="headline"/> 
            </p> 
           </a> 
          </article> 
         </xsl:if> 
        </xsl:for-each> 
       </section> 
      </xsl:if> 
     </xsl:when> 
     <xsl:when test="$type != ''"> 
      <xsl:variable name="query" select="$currentPage/* [@isDoc and string(umbracoNaviHide) != '1' and type = $type ]"/> 
      <xsl:if test="count($query) &gt; 0"> 
       <section class="brochures-{$section-css-name}"> 
        <xsl:choose> 
         <xsl:when test="$section-css-name = 'portrait' or region = $region"> 
          <h2>Business</h2> 
         </xsl:when> 
         <xsl:when test="$section-css-name = 'landscape' or region = $region"> 
          <h2>Panorama</h2> 
         </xsl:when> 
         <xsl:when test="$section-css-name = 'quadrat' or region = $region"> 
          <h2>Image</h2> 
         </xsl:when> 
        </xsl:choose> 
        <div class="case-shadow">&nbsp;<xsl:comment/> 
        </div> 
        <xsl:for-each select="$query"> 
         <xsl:choose> 
          <xsl:when test="position() = 1 or position() mod 3 = 0"> 
           <div class="row"> 
            <xsl:variable name="externalUrl" select="externalUrl"/> 
            <xsl:if test="$externalUrl != ''"> 
             <article class="brochure"> 
              <a href="{$externalUrl}/MailView/" target="_blank" class="replaceURL"> 
               <xsl:if test="$type = 60"> 
                <img src="{$externalUrl}/MailView/pagedata/frontpage.jpg" width="160" height="228" alt="" class="reflect"/> 
               </xsl:if> 
               <xsl:if test="$type = 61"> 
                <img src="{$externalUrl}/MailView/pagedata/frontpage.jpg" width="228" height="160" alt="" class="reflect"/> 
               </xsl:if> 
               <xsl:if test="$type = 62"> 
                <img src="{$externalUrl}/MailView/pagedata/frontpage.jpg" width="160" height="160" alt="" class="reflect"/> 
               </xsl:if> 
               <p> 
                <xsl:value-of select="headline"/> 
               </p> 
              </a> 
             </article> 
            </xsl:if> 
           </div> 
          </xsl:when> 
          <xsl:otherwise> 
           <xsl:variable name="externalUrl" select="externalUrl"/> 
           <xsl:if test="$externalUrl != ''"> 
            <article class="brochure"> 
             <a href="{$externalUrl}/MailView/" target="_blank" class="replaceURL"> 
              <xsl:if test="$type = 60"> 
               <img src="{$externalUrl}/MailView/pagedata/frontpage.jpg" width="160" height="228" alt="" class="reflect"/> 
              </xsl:if> 
              <xsl:if test="$type = 61"> 
               <img src="{$externalUrl}/MailView/pagedata/frontpage.jpg" width="228" height="160" alt="" class="reflect"/> 
              </xsl:if> 
              <xsl:if test="$type = 62"> 
               <img src="{$externalUrl}/MailView/pagedata/frontpage.jpg" width="160" height="160" alt="" class="reflect"/> 
              </xsl:if> 
              <p> 
               <xsl:value-of select="headline"/> 
              </p> 
             </a> 
            </article> 
           </xsl:if> 
          </xsl:otherwise> 
         </xsl:choose> 
        </xsl:for-each> 
       </section> 
      </xsl:if> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:variable name="query" select="$currentPage/* [@isDoc and string(umbracoNaviHide) != '1' and type = $type and region = $region ]"/> 
      <xsl:if test="count($query) &gt; 0"> 
       <section class="brochures-{$section-css-name}"> 
        <xsl:choose> 
         <xsl:when test="$section-css-name = 'portrait' or region = $region"> 
          <h2>Business</h2> 
         </xsl:when> 
         <xsl:when test="$section-css-name = 'landscape' or region = $region"> 
          <h2>Panorama</h2> 
         </xsl:when> 
         <xsl:when test="$section-css-name = 'quadrat' or region = $region"> 
          <h2>Image</h2> 
         </xsl:when> 
        </xsl:choose> 
        <div class="case-shadow">&nbsp;<xsl:comment/> 
        </div> 
        <xsl:for-each select="$query"> 
         <xsl:variable name="externalUrl" select="externalUrl"/> 
         <xsl:if test="$externalUrl != ''"> 
          <article class="brochure"> 
           <a href="{$externalUrl}/MailView/" target="_blank" class="replaceURL"> 
            <xsl:if test="$type = 60"> 
             <img src="{$externalUrl}/MailView/pagedata/frontpage.jpg" width="176" height="248" alt="" class="reflect"/> 
            </xsl:if> 
            <xsl:if test="$type = 61"> 
             <img src="{$externalUrl}/MailView/pagedata/frontpage.jpg" width="242" height="170" alt="" class="reflect"/> 
            </xsl:if> 
            <xsl:if test="$type = 62"> 
             <img src="{$externalUrl}/MailView/pagedata/frontpage.jpg" width="176" height="175" alt="" class="reflect"/> 
            </xsl:if> 
            <p> 
             <xsl:value-of select="headline"/> 
            </p> 
           </a> 
          </article> 
         </xsl:if> 
        </xsl:for-each> 
       </section> 
      </xsl:if> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 
+0

這類事情應該是直截了當的,但是您可以發佈您的輸入XML以及您的預期輸出,只是爲了不會對您的期望造成混淆。謝謝! – 2012-01-05 15:51:35

+0

我已更新帖子 – nuffsaid 2012-01-06 08:01:03

回答

2

相反遍歷所有的元素,determing每個人的位置,而不是反過來,你應該嘗試和相關元素在第1,第4匹配,第七(等)位置。

例如,假設您輸入XML是如下

<brochures> 
    <brochure>Brochure 1</brochure> 
    <brochure>Brochure 2</brochure> 
    <brochure>Brochure 3</brochure> 
    <brochure>Brochure 4</brochure> 
    <brochure>Brochure 5</brochure> 
</brochures> 

你會得到每一個第三個元素,像這樣

<xsl:apply-templates select="brochure[position() mod 3 = 1]" mode="first"/> 

一旦定位在這樣的行,那麼你可以寫出你的DIV ,然後匹配該組中所需的三行。

<div class="row"> 
    <xsl:apply-templates select="self::*|following-sibling::*[position() &lt; 3]"/> 
</div> 

這是完整的XSLT。注意我已經對每個div的行數進行了參數化,使其更具可配置性。

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

    <xsl:param name="rows" select="3" /> 

    <xsl:template match="/brochures"> 
     <section> 
     <xsl:apply-templates select="brochure[position() mod $rows = 1]" mode="first"/> 
     </section> 
    </xsl:template> 

    <xsl:template match="brochure" mode="first"> 
     <div class="row"> 
     <xsl:apply-templates select="self::*|following-sibling::*[position() &lt; $rows]"/> 
     </div> 
    </xsl:template> 

    <xsl:template match="brochure"> 
     <article class="brochure"/> 
    </xsl:template> 
</xsl:stylesheet> 

(請注意使用模式的兩個模板的小冊子元件匹配之間進行區分)

當施加到上面的樣品XML,則返回

<section> 
    <div class="row"> 
    <article class="brochure" /> 
    <article class="brochure" /> 
    <article class="brochure" /> 
    </div> 
    <div class="row"> 
    <article class="brochure" /> 
    <article class="brochure" /> 
    </div> 
</section> 
以下

希望這給你足夠的信息,以適應你自己的XML!