2012-03-22 11 views
0

我有一些輸入XML是XSLT計數位置和組項目相應

<collection> 
    <content> 
     <id>10</id> 
     <type>xx</type> 
     <title>xx</title> 
     <quicklink>xx</quicklink> 
     <teaser><p>xxx</p></teaser> 
     <root> 
      <thumb><img src="/xxx/xxx.jpg" /></thumb> 
      <link>http://www.foo.com</link> 
     </root> 
     <startDate></startDate> 
     <enddate></enddate> 
     <hyperlink><a href="http://www.foo.com">some text</a></hyperlink> 
    </content> 
    <content> 
     <id>10</id> 
     <type>xx</type> 
     <title>xx</title> 
     <quicklink>xx</quicklink> 
     <teaser><p>xxx</p></teaser> 
     <root> 
      <thumb><img src="/xxx/xxx.jpg" /></thumb> 
      <link>http://www.foo.com</link> 
     </root> 
     <startDate></startDate> 
     <enddate></enddate> 
     <hyperlink><a href="http://www.foo.com">some text</a></hyperlink> 
    </content> 
    <content> 
     <id>10</id> 
     <type>xx</type> 
     <title>xx</title> 
     <quicklink>xx</quicklink> 
     <teaser><p>xxx</p></teaser> 
     <root> 
      <thumb><img src="/xxx/xxx.jpg" /></thumb> 
      <link>http://www.foo.com</link> 
     </root> 
     <startDate></startDate> 
     <enddate></enddate> 
     <hyperlink><a href="http://www.foo.com">some text</a></hyperlink> 
    </content> 
</collection> 

XSLT寫入格式化無序列表如下

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
    <ul id="case-study-icons"> 
     <xsl:for-each select="collection/content"> 
     <li> 
      <a> 
      <xsl:attribute name="href"> 
       <xsl:value-of select="Html/root/Link"/> 
      </xsl:attribute> 
      <xsl:attribute name="title"> 
       <xsl:value-of select="title"/> 
      </xsl:attribute> 
      <img> 
       <xsl:attribute name="src"> 
       <xsl:value-of select="Html/root/thumb/img/@src"/> 
       </xsl:attribute> 
       <xsl:attribute name="alt"> 
       <xsl:value-of select="title"/> 
       </xsl:attribute> 
       <xsl:attribute name="width">92</xsl:attribute> 
       <xsl:attribute name="height">46</xsl:attribute> 
      </img> 
      </a> 
     </li> 
     </xsl:for-each> 
    </ul> 
    </xsl:template> 
</xsl:stylesheet> 

我想改變這個有3個圖像在一個li and grounp every 3 item occurance into 3 image links groups wrapped with李`裏面的鏈接。因此,在改造結束的HTML必須看起來像下面

<ul id="case-study-icons"> 
    <li> 
     <a href="#"><img src="/foo.jpg" /></a> 
     <a href="#"><img src="/foo.jpg" /></a> 
     <a href="#"><img src="/foo.jpg" /></a> 
    </li> 
    <li> 
     <a href="#"><img src="/foo.jpg" /></a> 
     <a href="#"><img src="/foo.jpg" /></a> 
     <a href="#"><img src="/foo.jpg" /></a> 
    </li> 
    <li> 
     <a href="#"><img src="/foo.jpg" /></a> 
     <a href="#"><img src="/foo.jpg" /></a> 
     <a href="#"><img src="/foo.jpg" /></a> 
    </li> 
</ul> 

我曾嘗試使用position()不知我的邏輯似乎不工作該做我自己。有人可以看看嗎?非常感謝提前..

+0

我有一個當前的XSLT已經寫成如上。目前,它每個「li」輸出1個圖像鏈接。我想將其更改爲每個「li」3個圖像鏈接。輸入到XSL是一個.NET對象列表。 – Chin 2012-03-22 10:22:24

+0

我指的是應用轉換的XML輸入。 – 2012-03-22 10:27:52

+0

我不幸沒有這些信息。這些項目通過我無法訪問的控件呈現。 :-( – Chin 2012-03-22 10:29:59

回答

3

選擇每三分之一Content元素,然後啓動li元素,然後在那裏選擇你需要的三個元素。目前還不清楚,如果你的Content要素是兄弟姐妹,所以我用following而不是following-sibling

<xsl:for-each select="(Collection/Content)[position() mod 3 = 1]"> 
    <li> 
     <xsl:for-each select=".|following::Content[position() &lt; 3]"> 
      <a href="{Html/root/Link}" title="{Title}"> 
       <img src="{Html/root/Thumb/img/@src}" alt="{Title}/> 
      </a> 
     </xsl:for-each> 
    </li> 
</xsl:for-each> 
+0

感謝David,由於某種原因,上面沒有顯示頁面上的任何內容,這意味着與上述XSLT有什麼關係。 – Chin 2012-03-22 11:10:38

+0

啊,如果它在第一行上有'''''''''',它會有所幫助。將更新。 – 2012-03-22 11:13:31

+0

它仍然是一樣的,除非你沒有更新它。如果有任何幫助,XML輸入位於頂部。 – Chin 2012-03-22 11:27:45

0

請大衛曾指出我在正確的方向,我已成功地來到了正確的轉換。

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/"> 
    <ul id="case-study-icons"> 
     <xsl:for-each select="(Collection/Content)[position() mod 3 = 1]"> 
     <li style="width:100px; float:left;"> 
     <xsl:for-each select=".|following-sibling::Content[position() &lt; 3]"> 
      <a> 
      <xsl:attribute name="href"> 
       <xsl:value-of select="Html/root/Link"/> 
      </xsl:attribute> 
      <xsl:attribute name="title"> 
       <xsl:value-of select="Title"/> 
      </xsl:attribute> 
      <img> 
       <xsl:attribute name="src"> 
       <xsl:value-of select="Html/root/Thumb/img/@src"/> 
       </xsl:attribute> 
       <xsl:attribute name="alt"> 
       <xsl:value-of select="Title"/> 
       </xsl:attribute> 
       <xsl:attribute name="width">92</xsl:attribute> 
       <xsl:attribute name="height">46</xsl:attribute> 
      </img> 
      </a> 
     </xsl:for-each> 
     </li> 
     </xsl:for-each> 
     </ul> 
    </xsl:template> 
</xsl:stylesheet> 
0

您可能需要進行參數每組項目,而不是硬編碼的數量。此外,它可以被可能被簡化,通過首先避免了嵌套XSL需要:的for-each,其次通過使用屬性值模板的寫出來屬性

嘗試此XSLT,例如

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:param name="itemsperlist" select="3" /> 

    <xsl:template match="/collection"> 
     <ul id="case-study-icons"> 
     <xsl:apply-templates select="content[(position() - 1) mod $itemsperlist = 0]" mode="first" /> 
     </ul> 
    </xsl:template> 

    <xsl:template match="content" mode="first"> 
     <li> 
     <xsl:apply-templates select=".|following-sibling::content[position() &lt; $itemsperlist]" /> 
     </li> 
    </xsl:template> 

    <xsl:template match="content"> 
     <a href="{root/link}" title="{title}"> 
     <img src="{root/thumb/img/@src}" alt="{title}" width="92" height="46" /> 
     </a> 
    </xsl:template> 
</xsl:stylesheet> 

請注意,如果您將更改爲,則此解決方案可以正常工作。