我有一些输入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()
以某种方式我的逻辑似乎不起作用。有人可以看看吗?非常感谢提前..
答案 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() < 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() < 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() < $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 ,此解决方案将有效。