XSLT相应地计算位置和组项

时间:2012-03-22 09:37:56

标签: c# html xslt xslt-1.0 xslt-2.0

我有一些输入XML

<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>

我想将其更改为在一个li and grounp every 3 item occurance into 3 image links groups wrapped with li`中包含3个图像链接。因此,在转换结束时,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()以某种方式我的逻辑似乎不起作用。有人可以看看吗?非常感谢提前..

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>

答案 2 :(得分:0)

您可能希望参数化每组的项目数,而不是硬编码 3 。此外,它可以简化,首先避免需要嵌套的 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>

请注意,如果您将 3 更改为 1 ,此解决方案将有效。