xml - 如何在 XSL 中将一个表垂直拆分为两个表?

标签 xml xslt position split

如果我有下表:

<table>
   <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td></tr>
   <tr><td>A</td><td>B</td><td>C</td><td>D</td><td>E</td><td>F</td></tr>
</table>

我将如何在 XSLT 中拆分它以便最终得到以下内容:

<table>
   <tr><td>1</td><td>2</td><td>3</td></tr>
   <tr><td>A</td><td>B</td><td>C</td></tr>
</table>    
<table>
   <tr><td>4</td><td>5</td><td>6</td></tr>
   <tr><td>D</td><td>E</td><td>F</td></tr>
</table>

我对一种通用方法很感兴趣,在这种方法中,表格可以有任何维度,并可以拆分成两个以上的表格。我不在乎行;我想在超过 N 列的地方进行拆分,最后得到 TD/N 表,其中 TD 是表数据单元格。例如,如果有 12 列和 25 行,我想要 4 个表,每个表有 3 列和 25 行。

最佳答案

试试这个。这应该适用于 XSLT 1.0。调整 ITEMS 变量以改变每个表所需的列数。

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

   <xsl:output method="html" omit-xml-declaration="yes"/>

   <xsl:variable name="ITEMS">3</xsl:variable>

   <xsl:template match="//table">
      <!-- Loop through the items in the first row -->
      <xsl:for-each select="tr[position() = 1]/td">
         <!-- Check if this item needs to be the start of a new row in a new table -->
         <xsl:if test="position() mod $ITEMS = 1">
            <!-- Get the current position which is used to get items from subsequent rows -->
            <xsl:variable name="COLUMNNUMBER" select="position()"/>
            <table>
               <!-- Loop through all the rows in the table -->
               <xsl:for-each select="../../tr">
                  <tr>
                     <!-- Output items within the required range using previously saved column number -->
                     <xsl:for-each select="td[position() &gt;= $COLUMNNUMBER and position() &lt; $COLUMNNUMBER + $ITEMS]">
                        <xsl:copy-of select="."/>
                     </xsl:for-each>
                  </tr>
               </xsl:for-each>
            </table>
         </xsl:if>
      </xsl:for-each>
   </xsl:template>

</xsl:stylesheet>

关于xml - 如何在 XSL 中将一个表垂直拆分为两个表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1938438/

相关文章:

c# - Unity Multiplayer向合作伙伴socket.io发送位置并更新

c# - 如何折叠空的 xml 标签?

c# - 如何在 C# 中创建 XML

java - 未使用 NodeList 获取 XML 标记值

python - 使用 Python 剥离 XML 节点之间的空格

xml - xslt:匹配部分属性名称

html - 用绝对位置定义流体宽度

html - 将绝对定位的子菜单向前推进?

java - 如何使用 JxPath 和 DOM 解析器解析 XML 文件

c# - 无法通过 .NET System.Xml.Xsl.XslCompiledTransform 将 XML 转换为 HTML