我需要创建XSLT以在重复的列中显示结果,以避免在页面中滚动。
在检查解决方案时,我从W3schools找到了一个例子 - http://www.w3schools.com/xsl/tryxslt.asp?xmlfile=cdcatalog&xsltfile=cdcatalog
上面的示例显示了如何使用XSLT添加多个列。但我的要求是不同的。如果我们采用相同的例子,我希望数据显示如下
标题作者标题作者
A-Title Gregory D-Title Ford
B-Title Dr.John E-Title Sean
C-Title Bellucci F-Title Steven
为了避免滚动用户,我需要将数据拆分为两列。结果也需要按字母顺序垂直排序。
任何建议都将不胜感激。 谢谢 约翰
答案 0 :(得分:2)
您可能需要尝试以下操作:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common" extension-element-prefixes="exsl">
<xsl:template match="/">
<html>
<body>
<h1>Collection</h1>
<table border="1" style="display:inline-block">
<tr>
<th>Title</th>
<th>Artist</th>
<th>Title</th>
<th>Artist</th>
</tr>
<xsl:variable name="sorted-cds">
<xsl:for-each select="catalog/cd">
<xsl:sort select="title" order="ascending" data-type="text" />
<xsl:copy-of select="."/>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="n" select="ceiling(count(catalog/cd) div 2)"/>
<xsl:for-each select="exsl:node-set($sorted-cds)/cd[position() <= $n]">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
<td><xsl:value-of select="following-sibling::cd[$n]/title"/></td>
<td><xsl:value-of select="following-sibling::cd[$n]/artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
基本思想是将CD排序为节点集(sorted-cds
)
计算行数的一半(n
),然后迭代
集合的前半部分(position() <= $n
)。
为了获得相应的第二张CD,只需
在集合中跳过(following-sibling::
)$n
张CD。
(请注意,您需要包含常见的EXSL扩展xmlns:exsl...
因为使用了非标准的exsl:node-set
函数。)
另一个注意事项:如果您想在页面中尝试上述内容
您在问题中链接了,可能需要替换<=
&lt;=
;他们似乎有一个引用错误(?)。