xml - XSL : List divided into columns

标签 xml xslt

请帮帮我。有一个节点列表。

<list>
  <item>1</item>
  <item>2</item>
  <item>3</item>
  <item>4</item>
  <item>5</item>
  <item>6</item>
  <item>7</item>
  and so on...
</list>

需要将“n”(任意数)个列表等分。

如果节点数不均分,则让最后一组节点包含剩余的划分。

例如,如果输入列表包含 33 个元素,输出应该有 4 个元素均匀分布的部分。在导出处得到 3 部分 9 个元素和 1 个部分 6 个元素的总和 33。

输入

<ul>
    <li>1</li>
    <li>2</li>
    ... 
    <li>33</li>
</ul>

输出

<ul>
    <li>1</li>
    <li>2</li>
    ... 
    <li>9</li>
</ul>
<ul>
    <li>10</li>
    <li>11</li>
    ... 
    <li>18</li>
</ul>
<ul>
    <li>19</li>
    <li>11</li>
    ... 
    <li>27</li>
</ul>
<ul>
    <li>28</li>
    <li>30</li>
    ... 
    <li>33</li>
</ul>

分为 4 列。

最佳答案

此解决方案不要求要分组到列中的节点应该是兄弟节点:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:variable name="vNodes" select="/*/*/text()"/>

 <xsl:param name="vNumParts" select="4"/>

 <xsl:variable name="vNumCols" select=
   "ceiling(count($vNodes) div $vNumParts)"/>

 <xsl:template match="/">
   <table border="1">
     <xsl:for-each select=
        "$vNodes[position() mod $vNumCols = 1]">
       <xsl:variable name="vCurPos" select=
         "(position()-1)*$vNumCols +1"/>
       <tr>
          <xsl:for-each select=
            "$vNodes[position() >= $vCurPos
                    and
                     not(position() > $vCurPos + $vNumCols -1)
                     ]">
           <td><xsl:copy-of select="."/></td>
          </xsl:for-each>
       </tr>
     </xsl:for-each>
   </table>
 </xsl:template>
</xsl:stylesheet>

应用于此 XML 文档时:

<list>
  <item>1</item>
  <item>2</item>
  <item>3</item>
  <item>4</item>
  <item>5</item>
  <item>6</item>
  <item>7</item>
  <item>8</item>
  <item>9</item>
  <item>10</item>
  <item>11</item>
  <item>12</item>
  <item>13</item>
  <item>14</item>
  <item>15</item>
  <item>16</item>
  <item>17</item>
  <item>18</item>
  <item>19</item>
  <item>20</item>
  <item>21</item>
  <item>22</item>
  <item>23</item>
  <item>24</item>
  <item>25</item>
  <item>26</item>
  <item>27</item>
  <item>28</item>
  <item>29</item>
  <item>30</item>
  <item>31</item>
  <item>32</item>
  <item>33</item>
</list>

产生了想要的结果:

<table border="1">
   <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
      <td>5</td>
      <td>6</td>
      <td>7</td>
      <td>8</td>
      <td>9</td>
   </tr>
   <tr>
      <td>10</td>
      <td>11</td>
      <td>12</td>
      <td>13</td>
      <td>14</td>
      <td>15</td>
      <td>16</td>
      <td>17</td>
      <td>18</td>
   </tr>
   <tr>
      <td>19</td>
      <td>20</td>
      <td>21</td>
      <td>22</td>
      <td>23</td>
      <td>24</td>
      <td>25</td>
      <td>26</td>
      <td>27</td>
   </tr>
   <tr>
      <td>28</td>
      <td>29</td>
      <td>30</td>
      <td>31</td>
      <td>32</td>
      <td>33</td>
   </tr>
</table>

关于xml - XSL : List divided into columns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2461866/

相关文章:

c# - 序列化到现有文件并删除声明

java - 如何使用Java正确压缩和转换TiledMap数据?

mysql - XML 到 MySQL : Only adding half of the items?

java - 如何将 Android View 绑定(bind)与 RecyclerView 结合使用

xml - 如何从父文档访问属性以在子文档中使用

javascript - 如何在 javascript 函数中嵌入 xslt?

XSLT 有助于将单个节点拆分为节点集合

java - Xpaths查询问题

javascript - 从 XML 模式生成表单键

javascript - 如何正确使用 XSLTProcessor 向现有 html 页面填写表格(或添加独立元素)?