需要将单个table按列拆分并转换为3个table

Need to split the single table by the column and convert into 3 tables

我需要拆分 table 的列,并在转换后的 xml.

上创建一个新的 table

输入XML我有:

<table frame="none">
   <tgroup cols="9">
      <colspec colname="column-0" colnum="1" colsep="1" rowsep="1" />
      <colspec colname="column-1" colnum="2" colsep="1" rowsep="1" />
      <colspec colname="column-2" colnum="3" colsep="1" rowsep="1" />
      <colspec colname="column-3" colnum="4" colsep="1" rowsep="1" />
      <colspec colname="column-4" colnum="5" colsep="1" rowsep="1" />
      <colspec colname="column-5" colnum="6" colsep="1" rowsep="1" />
      <colspec colname="column-6" colnum="7" colsep="1" rowsep="1" />
      <colspec colname="column-7" colnum="8" colsep="1" rowsep="1" />
      <colspec colname="column-8" colnum="9" colsep="1" rowsep="1" />
      <thead>
         <row>
            <entry colname="column-0" colsep="1" rowsep="1" />
            <entry colname="column-1" colsep="1" rowsep="1">
               <p>
                  <b>AAAA</b>
               </p>
            </entry>
            <entry colname="column-2" colsep="1" rowsep="1">
               <p>
                  <b>BBBBBBBB</b>
                  [%]
               </p>
            </entry>
            <entry colname="column-3" colsep="1" rowsep="1">
               <p>
                  <b>CCCC</b>
               </p>
            </entry>
            <entry colname="column-4" colsep="1" rowsep="1">
               <p>
                  <b>DDDDDDD</b>
                  [%]
               </p>
            </entry>
            <entry colname="column-5" colsep="1" rowsep="1">
               <p>
                  <b>EEEE</b>
                  [%]
               </p>
            </entry>
            <entry colname="column-6" colsep="1" rowsep="1">
               <p>
                  <b>FFFF</b>
                  [%]
               </p>
            </entry>
            <entry colname="column-7" colsep="1" rowsep="1">
               <p>
                  <b>GGGG</b>
                  [%]
               </p>
            </entry>
            <entry colname="column-8" colsep="1" rowsep="1">
               <p>
                  <b>
                     HHH
                     <b>1</b>
                  </b>
               </p>
            </entry>
         </row>
      </thead>
      <tbody>
         <row>
            <entry colname="column-0" colsep="1" rowsep="1">
               <p>5°C/ambient RH 1.5 months</p>
            </entry>
            <entry colname="column-1" colsep="1" rowsep="1">
               <p>101.6</p>
            </entry>
            <entry colname="column-2" colsep="1" rowsep="1">
               <p>&lt;0.2</p>
            </entry>
            <entry colname="column-3" colsep="1" rowsep="1">
               <p>0.1</p>
            </entry>
            <entry colname="column-4" colsep="1" rowsep="1">
               <p>0.2</p>
            </entry>
            <entry colname="column-5" colsep="1" rowsep="1">
               <p>0.2</p>
            </entry>
            <entry colname="column-6" colsep="1" rowsep="1">
               <p>0.2</p>
            </entry>
            <entry colname="column-7" colsep="1" rowsep="1">
               <p>0.1</p>
            </entry>
            <entry colname="column-8" colsep="1" rowsep="1">
               <p>0.6</p>
            </entry>
         </row>
      </tbody>
   </tgroup>
</table>

需要将输入 xml 拆分为 3 xml (Colspec 0 to 2, 3 to 5, 6 to 8) 就像 3 colspec,3 rows 3 entry.

第一XML:

<table frame="none">
   <tgroup cols="9">
      <colspec colname="column-0" colnum="1" colsep="1" rowsep="1" />
      <colspec colname="column-1" colnum="2" colsep="1" rowsep="1" />
      <colspec colname="column-2" colnum="3" colsep="1" rowsep="1" />
      <thead>
         <row>
            <entry colname="column-0" colsep="1" rowsep="1" />
            <entry colname="column-1" colsep="1" rowsep="1">
               <p>
                  <b>AAAA</b>
               </p>
            </entry>
            <entry colname="column-2" colsep="1" rowsep="1">
               <p>
                  <b>BBBBBBBB</b>
                  [%]
               </p>
            </entry>
          </row>
      </thead>
      <tbody>
         <row>
            <entry colname="column-0" colsep="1" rowsep="1">
               <p>5°C/ambient RH 1.5 months</p>
            </entry>
            <entry colname="column-1" colsep="1" rowsep="1">
               <p>101.6</p>
            </entry>
            <entry colname="column-2" colsep="1" rowsep="1">
               <p>&lt;0.2</p>
            </entry>
          </row>
      </tbody>
   </tgroup>
</table>

好像我还需要两个输出 xml 用于 colspec 3 到 5 和 6 到 8。

我试过的XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
   <xsl:output omit-xml-declaration="yes" indent="yes" />
   <xsl:strip-space elements="*" />
   <xsl:template match="node()|@*">
      <xsl:copy>
         <xsl:apply-templates select="node()|@*" />
      </xsl:copy>
   </xsl:template>
   <xsl:template match="/">
      <xsl:apply-templates select="node()|@*" />
      <xsl:result-document href="file:///C://xslttransform//table3.xml">
         <xsl:apply-templates select="node()|@*" />
         <xsl:apply-templates select="/topic/body/table/tgroup/colspec" />
         <xsl:apply-templates select="/topic/body/table/tgroup/thead" />
         <xsl:apply-templates select="/topic/body/table/tgroup/tbody" />
      </xsl:result-document>
      <xsl:result-document href="file:///C://xslttransform//table2.xml">
         <xsl:apply-templates select="node()|@*" />
      </xsl:result-document>
      <xsl:result-document href="file:///C://xslttransform//table1.xml">
         <xsl:apply-templates select="node()|@*" />
      </xsl:result-document>
   </xsl:template>
   <xsl:template match="/topic/body/table/tgroup/colspec">
      <xsl:message>Test11</xsl:message>
      <xsl:if test=".[@colname='column-0']">
         <xsl:message>Test22</xsl:message>
         <xsl:variable name="columnfontoId">
            <xsl:value-of select="./@id" />
         </xsl:variable>
         <colspec colname="column-0" colnum="1" colsep="1" id="{$columnfontoId}" rowsep="1" />
      </xsl:if>
      <xsl:if test=".[@colname='column-1']">
         <xsl:message>Test22</xsl:message>
         <xsl:variable name="columnfontoId">
            <xsl:value-of select="./@id" />
         </xsl:variable>
         <colspec colname="column-1" colnum="2" colsep="1" id="{$columnfontoId}" rowsep="1" />
      </xsl:if>
      <xsl:if test=".[@colname='column-2']">
         <xsl:message>Test22</xsl:message>
         <xsl:variable name="columnfontoId">
            <xsl:value-of select="./@id" />
         </xsl:variable>
         <colspec colname="column-2" colnum="3" colsep="1" id="{$columnfontoId}" rowsep="1" />
      </xsl:if>
   </xsl:template>
   <xsl:template match="/topic/body/table/tgroup/thead">
      <xsl:variable name="columnfontoId">
         <xsl:value-of select="./@id" />
      </xsl:variable>
      <thead id="{$columnfontoId}">
         <xsl:for-each select="row">
            <xsl:variable name="columnfontoId">
               <xsl:value-of select="./@id" />
            </xsl:variable>
            <row id="{$columnfontoId}">
               <xsl:for-each select="entry">
                  <xsl:if test=".[@colname='column-0' or @colname='column-1' or @colname='column-2']">
                     <xsl:message>Test333</xsl:message>
                     <xsl:copy-of select="." />
                  </xsl:if>
               </xsl:for-each>
            </row>
         </xsl:for-each>
      </thead>
   </xsl:template>
   <xsl:template match="/topic/body/table/tgroup/tbody">
      <xsl:variable name="columnfontoId">
         <xsl:value-of select="./@id" />
      </xsl:variable>
      <tbody id="{$columnfontoId}">
         <xsl:for-each select="row">
            <xsl:variable name="columnfontoId">
               <xsl:value-of select="./@id" />
            </xsl:variable>
            <row id="{$columnfontoId}">
               <xsl:for-each select="entry">
                  <xsl:if test=".[@colname='column-0' or @colname='column-1' or @colname='column-2']">
                     <xsl:message>Test333</xsl:message>
                     <xsl:copy-of select="." />
                  </xsl:if>
               </xsl:for-each>
            </row>
         </xsl:for-each>
      </tbody>
   </xsl:template>
</xsl:stylesheet>

拆分可以这样进行:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="#all"
    version="3.0">
    
  <xsl:strip-space elements="*"/>
  <xsl:output indent="yes"/>
    
  <xsl:param name="block-size" as="xs:integer" select="3"/>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template match="table">
      <xsl:for-each-group select="tgroup/colspec" group-adjacent="(position() - 1) idiv $block-size">
          <xsl:apply-templates select="../.." mode="split"/>
      </xsl:for-each-group>
  </xsl:template>
  
  <xsl:mode name="split" on-no-match="shallow-copy"/>
  
  <xsl:template match="colspec | entry" mode="split">
      <xsl:if test="@colname = current-group()/@colname">
          <xsl:next-match/>
      </xsl:if>
  </xsl:template>
  
</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/jxNakAK

要在单独的文件中输出每个结果 table,请在未命名模式下更改 table 的模板,并在 split 模式下为 table 添加一个模板:

 <xsl:template match="table">
      <xsl:for-each-group select="tgroup/colspec" group-adjacent="(position() - 1) idiv $block-size">
          <xsl:apply-templates select="../.." mode="split">
            <xsl:with-param name="pos" select="position()"/>
          </xsl:apply-templates>
      </xsl:for-each-group>
  </xsl:template>
  
  <xsl:mode name="split" on-no-match="shallow-copy"/>
  
  <xsl:template match="table" mode="split">
    <xsl:param name="pos"/>
    <xsl:result-document href="table-{$pos}.xml">
      <xsl:next-match/>
    </xsl:result-document>
  </xsl:template>