XSLT以重复列显示数据

时间:2014-12-17 19:27:56

标签: xslt

我需要创建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

为了避免滚动用户,我需要将数据拆分为两列。结果也需要按字母顺序垂直排序。

任何建议都将不胜感激。 谢谢 约翰

1 个答案:

答案 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() &lt;= $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;= &amp;lt;=;他们似乎有一个引用错误(?)。