2016-09-26 128 views
0

我有一个XML文件有一个表。我正在使用XSLT版本1.0。我需要在特定数量的行之后拆分表(7行之后的示例)。下一页应该有相同的标题,数据应该继续。水平分割XML表

图: 1. Original Table 2. Table Transform

XML:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl"?> 
<TABLE FRAME="ALL"> 
<TGROUP COLS="3"> 
<COLSPEC COLNAME="col1" COLWIDTH="5cm"/> 
<COLSPEC COLNAME="col2" COLWIDTH="6.00cm"/> 
<COLSPEC COLNAME="col3" COLWIDTH="5.91cm"/> 
<THEAD> 
<ROW> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA><EMPHASIS>TA</EMPHASIS></PARA></ENTRY> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA><EMPHASIS>TB</EMPHASIS></PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA><EMPHASIS>TC</EMPHASIS></PARA></ENTRY> 
</ROW> 
</THEAD> 
<TBODY> 
<ROW> 
<ENTRY COLSEP="1" MOREROWS="13" ROWSEP="1"><PARA>A</PARA></ENTRY> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA>B</PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>C</PARA></ENTRY> 
</ROW> 
<ROW> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA>A1</PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>B1</PARA></ENTRY> 
</ROW> 
<ROW> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA>A2</PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>B2</PARA></ENTRY> 
</ROW> 
<ROW> 

<ENTRY COLSEP="1" ROWSEP="1"><PARA>A4</PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>A5</PARA></ENTRY> 
</ROW> 
<ROW> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA>A5<PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>A6</PARA></ENTRY> 
</ROW> 
<ROW> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA>A6</PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>A7</PARA></ENTRY> 
</ROW> 
<ROW> 

<ENTRY COLSEP="1" ROWSEP="1"><PARA>A7</PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>A8</PARA></ENTRY> 
</ROW> 
<ROW> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA>A8</PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>A9</PARA></ENTRY> 
</ROW> 
<ROW> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA>A9</PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>A10</PARA></ENTRY> 
</ROW> 
<ROW> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA>A10</PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>A11</PARA></ENTRY> 
</ROW> 
<ROW> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA>A11</PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>A12</PARA></ENTRY> 
</ROW> 
</TBODY> 
</TGROUP> 
</TABLE> 

XSLT:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:param name="prowLimit" select="10"/> 

    <xsl:variable name="vartable" select="/*"/> 

    <xsl:template match="node()|@*" name="identity"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="TABLE/ROW"> 
    <xsl:if test="position() mod $prowLimit = 7"> 

     <TBODY> 
     <xsl:copy-of select="$vartable/@*"/> 
     <xsl:copy-of select=". | following-sibling::ROW[not(position() > $prowLimit)]"/> 
     </TBODY> 


    </xsl:if> 
    </xsl:template> 
    </xsl:stylesheet> 

所需的输出:

<?xml version="1.0" encoding="UTF-8"?> 
<?xml-stylesheet type="text/xsl"?> 
<TABLE FRAME="ALL"> 
<TGROUP COLS="3"> 
<COLSPEC COLNAME="col1" COLWIDTH="5cm"/> 
<COLSPEC COLNAME="col2" COLWIDTH="6.00cm"/> 
<COLSPEC COLNAME="col3" COLWIDTH="5.91cm"/> 
<THEAD> 
<ROW> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA><EMPHASIS>TA</EMPHASIS></PARA></ENTRY> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA><EMPHASIS>TB</EMPHASIS></PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA><EMPHASIS>TC</EMPHASIS></PARA></ENTRY> 
</ROW> 
</THEAD> 
<TBODY> 
<ROW> 
<ENTRY COLSEP="1" MOREROWS="13" ROWSEP="1"><PARA>A</PARA></ENTRY> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA>B</PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>C</PARA></ENTRY> 
</ROW> 
<ROW> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA>A1</PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>B1</PARA></ENTRY> 
</ROW> 
<ROW> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA>A2</PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>B2</PARA></ENTRY> 
</ROW> 
<ROW> 

<ENTRY COLSEP="1" ROWSEP="1"><PARA>A4</PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>A5</PARA></ENTRY> 
</ROW> 
<ROW> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA>A5<PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>A6</PARA></ENTRY> 
</ROW> 
<ROW> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA>A6</PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>A7</PARA></ENTRY> 
</ROW> 
</TBODY> 
</TGROUP> 
</TABLE> 
<TABLE FRAME="ALL"> 
<TGROUP COLS="3"> 
<COLSPEC COLNAME="col1" COLWIDTH="5cm"/> 
<COLSPEC COLNAME="col2" COLWIDTH="6.00cm"/> 
<COLSPEC COLNAME="col3" COLWIDTH="5.91cm"/> 
<THEAD> 

<ROW> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA><EMPHASIS>TA</EMPHASIS></PARA></ENTRY> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA><EMPHASIS>TB</EMPHASIS></PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA><EMPHASIS>TC</EMPHASIS></PARA></ENTRY> 
</ROW> 
</THEAD> 
<TBODY> 
<ROW> 

<ENTRY COLSEP="1" ROWSEP="1"><PARA>A7</PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>A8</PARA></ENTRY> 
</ROW> 
<ROW> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA>A8</PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>A9</PARA></ENTRY> 
</ROW> 
<ROW> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA>A9</PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>A10</PARA></ENTRY> 
</ROW> 
<ROW> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA>A10</PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>A11</PARA></ENTRY> 
</ROW> 
<ROW> 
<ENTRY COLSEP="1" ROWSEP="1"><PARA>A11</PARA></ENTRY> 
<ENTRY COLSEP="0" ROWSEP="1"><PARA>A12</PARA></ENTRY> 
</ROW> 
</TBODY> 
</TGROUP> 
</TABLE> 

但是,我不知道是否所需的输出是正确的,因为我不知道它是否遵循XML层次结构。我将按照图中所示的最终结果来实现。

我使用了Dimitre Novatchev在Split large table into several smaller tables提供的概念。我得到XML解析器错误,以便用XML维护XML的结构。

如何修改XSLT以便我可以得到“Table Transform”图中显示的输出?

+0

两个表格链接指向相同的图像。 –

+0

谢谢蒂姆,更新了这个数字。 –

+0

请发布(1)**完整** XML和(2)预期结果**作为代码**。 –

回答

0

觉得你想要做这样的事情

XSLT 1.0

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/TABLE"> 
    <xsl:variable name="head" select="TGROUP/COLSPEC | TGROUP/THEAD" /> 
    <xsl:for-each select="TGROUP/TBODY/ROW[position() mod 7 = 1]"> 
     <TABLE> 
      <xsl:copy-of select="ancestor::TABLE/@*"/> 
      <TGROUP> 
       <xsl:copy-of select="ancestor::TGROUP/@*"/> 
       <xsl:copy-of select="$head"/> 
       <TBODY> 
        <xsl:copy-of select=". | following-sibling::ROW[position() &lt; 7]"/> 
       </TBODY> 
      </TGROUP> 
     </TABLE> 
    </xsl:for-each> 
</xsl:template> 

</xsl:stylesheet> 

应用到合式输入,如:

XML

<TABLE FRAME="ALL"> 
    <TGROUP COLS="3"> 
    <COLSPEC COLNAME="col1" COLWIDTH="5cm"/> 
    <COLSPEC COLNAME="col2" COLWIDTH="6.00cm"/> 
    <COLSPEC COLNAME="col3" COLWIDTH="5.91cm"/> 
    <THEAD> 
     <ROW> 
     <ENTRY COLSEP="1" ROWSEP="1"> 
      <PARA> 
      <EMPHASIS>TA</EMPHASIS> 
      </PARA> 
     </ENTRY> 
     <ENTRY COLSEP="1" ROWSEP="1"> 
      <PARA> 
      <EMPHASIS>TB</EMPHASIS> 
      </PARA> 
     </ENTRY> 
     <ENTRY COLSEP="0" ROWSEP="1"> 
      <PARA> 
      <EMPHASIS>TC</EMPHASIS> 
      </PARA> 
     </ENTRY> 
     </ROW> 
    </THEAD> 
    <TBODY> 
     <ROW> 
     <ENTRY COLSEP="1" MOREROWS="13" ROWSEP="1"> 
      <PARA>A</PARA> 
     </ENTRY> 
     <ENTRY COLSEP="1" ROWSEP="1"> 
      <PARA>B</PARA> 
     </ENTRY> 
     <ENTRY COLSEP="0" ROWSEP="1"> 
      <PARA>C</PARA> 
     </ENTRY> 
     </ROW> 
     <ROW> 
     <ENTRY COLSEP="1" ROWSEP="1"> 
      <PARA>A1</PARA> 
     </ENTRY> 
     <ENTRY COLSEP="0" ROWSEP="1"> 
      <PARA>B1</PARA> 
     </ENTRY> 
     </ROW> 
     <ROW> 
     <ENTRY COLSEP="1" ROWSEP="1"> 
      <PARA>A2</PARA> 
     </ENTRY> 
     <ENTRY COLSEP="0" ROWSEP="1"> 
      <PARA>B2</PARA> 
     </ENTRY> 
     </ROW> 
     <ROW> 
     <ENTRY COLSEP="1" ROWSEP="1"> 
      <PARA>A4</PARA> 
     </ENTRY> 
     <ENTRY COLSEP="0" ROWSEP="1"> 
      <PARA>A5</PARA> 
     </ENTRY> 
     </ROW> 
     <ROW> 
     <ENTRY COLSEP="1" ROWSEP="1"> 
      <PARA>A5</PARA> 
     </ENTRY> 
     <ENTRY COLSEP="0" ROWSEP="1"> 
      <PARA>A6</PARA> 
     </ENTRY> 
     </ROW> 
     <ROW> 
     <ENTRY COLSEP="1" ROWSEP="1"> 
      <PARA>A6</PARA> 
     </ENTRY> 
     <ENTRY COLSEP="0" ROWSEP="1"> 
      <PARA>A7</PARA> 
     </ENTRY> 
     </ROW> 
     <ROW> 
     <ENTRY COLSEP="1" ROWSEP="1"> 
      <PARA>A7</PARA> 
     </ENTRY> 
     <ENTRY COLSEP="0" ROWSEP="1"> 
      <PARA>A8</PARA> 
     </ENTRY> 
     </ROW> 
     <ROW> 
     <ENTRY COLSEP="1" ROWSEP="1"> 
      <PARA>A8</PARA> 
     </ENTRY> 
     <ENTRY COLSEP="0" ROWSEP="1"> 
      <PARA>A9</PARA> 
     </ENTRY> 
     </ROW> 
     <ROW> 
     <ENTRY COLSEP="1" ROWSEP="1"> 
      <PARA>A9</PARA> 
     </ENTRY> 
     <ENTRY COLSEP="0" ROWSEP="1"> 
      <PARA>A10</PARA> 
     </ENTRY> 
     </ROW> 
     <ROW> 
     <ENTRY COLSEP="1" ROWSEP="1"> 
      <PARA>A10</PARA> 
     </ENTRY> 
     <ENTRY COLSEP="0" ROWSEP="1"> 
      <PARA>A11</PARA> 
     </ENTRY> 
     </ROW> 
     <ROW> 
     <ENTRY COLSEP="1" ROWSEP="1"> 
      <PARA>A11</PARA> 
     </ENTRY> 
     <ENTRY COLSEP="0" ROWSEP="1"> 
      <PARA>A12</PARA> 
     </ENTRY> 
     </ROW> 
    </TBODY> 
    </TGROUP> 
</TABLE> 

结果将是:

<?xml version="1.0" encoding="UTF-8"?> 
<TABLE FRAME="ALL"> 
    <TGROUP COLS="3"> 
     <COLSPEC COLNAME="col1" COLWIDTH="5cm"/> 
     <COLSPEC COLNAME="col2" COLWIDTH="6.00cm"/> 
     <COLSPEC COLNAME="col3" COLWIDTH="5.91cm"/> 
     <THEAD> 
     <ROW> 
      <ENTRY COLSEP="1" ROWSEP="1"> 
       <PARA> 
        <EMPHASIS>TA</EMPHASIS> 
       </PARA> 
      </ENTRY> 
      <ENTRY COLSEP="1" ROWSEP="1"> 
       <PARA> 
        <EMPHASIS>TB</EMPHASIS> 
       </PARA> 
      </ENTRY> 
      <ENTRY COLSEP="0" ROWSEP="1"> 
       <PARA> 
        <EMPHASIS>TC</EMPHASIS> 
       </PARA> 
      </ENTRY> 
     </ROW> 
     </THEAD> 
     <TBODY> 
     <ROW> 
      <ENTRY COLSEP="1" MOREROWS="13" ROWSEP="1"> 
       <PARA>A</PARA> 
      </ENTRY> 
      <ENTRY COLSEP="1" ROWSEP="1"> 
       <PARA>B</PARA> 
      </ENTRY> 
      <ENTRY COLSEP="0" ROWSEP="1"> 
       <PARA>C</PARA> 
      </ENTRY> 
     </ROW> 
     <ROW> 
      <ENTRY COLSEP="1" ROWSEP="1"> 
       <PARA>A1</PARA> 
      </ENTRY> 
      <ENTRY COLSEP="0" ROWSEP="1"> 
       <PARA>B1</PARA> 
      </ENTRY> 
     </ROW> 
     <ROW> 
      <ENTRY COLSEP="1" ROWSEP="1"> 
       <PARA>A2</PARA> 
      </ENTRY> 
      <ENTRY COLSEP="0" ROWSEP="1"> 
       <PARA>B2</PARA> 
      </ENTRY> 
     </ROW> 
     <ROW> 
      <ENTRY COLSEP="1" ROWSEP="1"> 
       <PARA>A4</PARA> 
      </ENTRY> 
      <ENTRY COLSEP="0" ROWSEP="1"> 
       <PARA>A5</PARA> 
      </ENTRY> 
     </ROW> 
     <ROW> 
      <ENTRY COLSEP="1" ROWSEP="1"> 
       <PARA>A5</PARA> 
      </ENTRY> 
      <ENTRY COLSEP="0" ROWSEP="1"> 
       <PARA>A6</PARA> 
      </ENTRY> 
     </ROW> 
     <ROW> 
      <ENTRY COLSEP="1" ROWSEP="1"> 
       <PARA>A6</PARA> 
      </ENTRY> 
      <ENTRY COLSEP="0" ROWSEP="1"> 
       <PARA>A7</PARA> 
      </ENTRY> 
     </ROW> 
     <ROW> 
      <ENTRY COLSEP="1" ROWSEP="1"> 
       <PARA>A7</PARA> 
      </ENTRY> 
      <ENTRY COLSEP="0" ROWSEP="1"> 
       <PARA>A8</PARA> 
      </ENTRY> 
     </ROW> 
     </TBODY> 
    </TGROUP> 
</TABLE> 
<TABLE FRAME="ALL"> 
    <TGROUP COLS="3"> 
     <COLSPEC COLNAME="col1" COLWIDTH="5cm"/> 
     <COLSPEC COLNAME="col2" COLWIDTH="6.00cm"/> 
     <COLSPEC COLNAME="col3" COLWIDTH="5.91cm"/> 
     <THEAD> 
     <ROW> 
      <ENTRY COLSEP="1" ROWSEP="1"> 
       <PARA> 
        <EMPHASIS>TA</EMPHASIS> 
       </PARA> 
      </ENTRY> 
      <ENTRY COLSEP="1" ROWSEP="1"> 
       <PARA> 
        <EMPHASIS>TB</EMPHASIS> 
       </PARA> 
      </ENTRY> 
      <ENTRY COLSEP="0" ROWSEP="1"> 
       <PARA> 
        <EMPHASIS>TC</EMPHASIS> 
       </PARA> 
      </ENTRY> 
     </ROW> 
     </THEAD> 
     <TBODY> 
     <ROW> 
      <ENTRY COLSEP="1" ROWSEP="1"> 
       <PARA>A8</PARA> 
      </ENTRY> 
      <ENTRY COLSEP="0" ROWSEP="1"> 
       <PARA>A9</PARA> 
      </ENTRY> 
     </ROW> 
     <ROW> 
      <ENTRY COLSEP="1" ROWSEP="1"> 
       <PARA>A9</PARA> 
      </ENTRY> 
      <ENTRY COLSEP="0" ROWSEP="1"> 
       <PARA>A10</PARA> 
      </ENTRY> 
     </ROW> 
     <ROW> 
      <ENTRY COLSEP="1" ROWSEP="1"> 
       <PARA>A10</PARA> 
      </ENTRY> 
      <ENTRY COLSEP="0" ROWSEP="1"> 
       <PARA>A11</PARA> 
      </ENTRY> 
     </ROW> 
     <ROW> 
      <ENTRY COLSEP="1" ROWSEP="1"> 
       <PARA>A11</PARA> 
      </ENTRY> 
      <ENTRY COLSEP="0" ROWSEP="1"> 
       <PARA>A12</PARA> 
      </ENTRY> 
     </ROW> 
     </TBODY> 
    </TGROUP> 
</TABLE> 

注意,输出没有良好的XML,因为它不具有一个根元素。

+0

谢谢迈克尔。我修改了帖子。但不知何故,我无法分裂时,适用于我的XML –

+0

我没有得到表中的第二次拆分 –

+0

@ShravanVishwanathan我已修改我的答案,以适应TGROUP的变化。请注意,您的输入XML仍存在缺陷:您有一个未封闭的PARA元素。 –