2012-03-22 12 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> 

请注意,如果您将更改为,则此解决方案可以正常工作。