整合两个 xslt 模板 rowmerge 和标签删除的问题

Issue in integarting two xslt templates rowmerge and tag removal

We have two diffrent scenario we got answers in the forum   

(我们需要检索 Thead 中 para 内的 ref 标签我们需要删除 Tbody 中 para 内的 ref 标签。对于最后一个单元格,我们不应该执行此 ref 删除。即)应该表现得像 thead)

writing xslt for the below scenario

(规则:对于合并行:将主合并单元格的内容复制到合并行中的其他单元格。) 但是 integrating/testing 我们遇到了问题。整合后,我们没有得到预期的 output.ie) 标签移除在第一行完成,但在合并的行中它是noit heppening。 有人可以在这方面帮助我们吗?

示例输入:

    <?xml version="1.0" encoding="UTF-8"?>
    <TABLE align="CENTER" >
    <THEAD editable="T">
        <ROW editable="F">
            <CELL rowmerged="F" ><Para appdisplaytext=" ">S.No </Para></CELL>
            <CELL rowmerged="F" ><Para appdisplaytext=" ">Name</Para></CELL>
              <CELL rowmerged="F" ><Para appdisplaytext=" ">Role</Para></CELL>
            <CELL colmerged="F" ><Para appdisplaytext=" " >Comment</Para></CELL> 
        </ROW>
    </THEAD>
    <TBODY editable="T">
        <ROW editable="F">
           <CELL rowmerged="T" ><Para appdisplaytext=" "><refint>S.No1 </refint>  </Para></CELL>
            <CELL rowmerged="F" ><Para appdisplaytext=" ">Name1</Para></CELL>
              <CELL rowmerged="F" ><Para appdisplaytext=" ">  <refint>Role1</refint></Para></CELL>
            <CELL colmerged="F" ><Para appdisplaytext=" " >Comment1</Para>   </CELL> 
        </ROW>
        <ROW editable="F">
            <CELL rowmerged="T" ><Para appdisplaytext=" "></Para></CELL>
            <CELL rowmerged="F" ><Para appdisplaytext=" ">Name2</Para></CELL>
              <CELL rowmerged="F" ><Para appdisplaytext=" ">Role2</Para></CELL>
            <CELL colmerged="F" ><Para appdisplaytext=" " >Comment2</Para>  </CELL>
        </ROW>
        <ROW editable="F">
            <CELL rowmerged="F" ><Para appdisplaytext=" ">S.No 3</Para></CELL>
            <CELL rowmerged="F" ><Para appdisplaytext=" ">Name3</Para></CELL>
              <CELL rowmerged="F" ><Para appdisplaytext=" "><refint>Role3</refint></Para></CELL>
            <CELL colmerged="F" ><Para appdisplaytext=" " >Comment3</Para></CELL>
        </ROW>
        <ROW editable="F">
            <CELL rowmerged="F" ><Para appdisplaytext=" ">S.No 4</Para></CELL>
            <CELL rowmerged="F" ><Para appdisplaytext=" ">Name4</Para></CELL>
              <CELL rowmerged="F" ><Para appdisplaytext=" ">Role4</Para></CELL>
            <CELL colmerged="F" ><Para appdisplaytext=" " >Comment4</Para></CELL> 
        </ROW>
       </TBODY>
     </TABLE>

XSLT 尝试过:

     <?xml version="1.0" encoding="UTF-8" ?>
     <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
     <xsl:output method="xml"  omit-xml-declaration="no" encoding="UTF-8" indent="yes" />
      <xsl:strip-space elements="*"/>
      <xsl:template match="table">
     <xsl:apply-templates/>
     </xsl:template>
     <xsl:template match="@*|node()">
     <xsl:copy>
        <xsl:apply-templates select="@*|node()"/>
     </xsl:copy>
     </xsl:template>
     <xsl:template match="TBODY/ROW/CELL[position()!=last()]/Para/refint">
     <xsl:value-of select="."/>
     </xsl:template>
     <xsl:template match="//TABLE//Para[not(normalize-space())][../@rowmerged='T']">
          <xsl:variable name="cellnum" select="count(../preceding-sibling::CELL) + 1"/>
          <xsl:variable name="matchingCells" select="               ../../preceding-sibling::ROW/CELL[$cellnum]/Para"/>
          <xsl:copy-of select="$matchingCells[normalize-space()][last()]"/>
         </xsl:template>
       </xsl:transform>

预期输出:

     <?xml version="1.0" encoding="UTF-8"?>
     <TABLE align="CENTER" >
     <THEAD editable="T">
        <ROW editable="F">
            <CELL rowmerged="F" ><Para appdisplaytext=" ">S.No </Para></CELL>
            <CELL rowmerged="F" ><Para appdisplaytext=" ">Name</Para></CELL>
              <CELL rowmerged="F" ><Para appdisplaytext=" ">Role</Para></CELL>
            <CELL colmerged="F" ><Para appdisplaytext=" " >Comment</Para></CELL> 
        </ROW>
      </THEAD>
      <TBODY editable="T">
        <ROW editable="F">
           <CELL rowmerged="T" ><Para appdisplaytext=" ">S.No1 </Para></CELL>
            <CELL rowmerged="F" ><Para appdisplaytext=" ">Name1</Para></CELL>
              <CELL rowmerged="F" ><Para appdisplaytext=" ">Role1</Para></CELL>
            <CELL colmerged="F" ><Para appdisplaytext=" " >Comment1</Para></CELL> 
        </ROW>
        <ROW editable="F">
            <CELL rowmerged="T" ><Para appdisplaytext=" ">S.No1 </Para></CELL>
            <CELL rowmerged="F" ><Para appdisplaytext=" ">Name2</Para></CELL>
              <CELL rowmerged="F" ><Para appdisplaytext=" ">Role2</Para></CELL>
            <CELL colmerged="F" ><Para appdisplaytext=" " >Comment2</Para></CELL>
        </ROW>
        <ROW editable="F">
            <CELL rowmerged="F" ><Para appdisplaytext=" ">S.No 3</Para></CELL>
            <CELL rowmerged="F" ><Para appdisplaytext=" ">Name3</Para></CELL>
              <CELL rowmerged="F" ><Para appdisplaytext=" ">Role3</Para></CELL>
            <CELL colmerged="F" ><Para appdisplaytext=" " >Comment3</Para></CELL>
        </ROW>
        <ROW editable="F">
            <CELL rowmerged="F" ><Para appdisplaytext=" ">S.No 4</Para></CELL>
            <CELL rowmerged="F" ><Para appdisplaytext=" ">Name4</Para></CELL>
              <CELL rowmerged="F" ><Para appdisplaytext=" ">Role4</Para></CELL>
            <CELL colmerged="F" ><Para appdisplaytext=" " >Comment4</Para></CELL> 
        </ROW>
        </TBODY>
       </TABLE>

我们得到了:

        <?xml version="1.0" encoding="UTF-8"?>
        <TABLE align="CENTER">
        <THEAD editable="T">
        <ROW editable="F">
        <CELL rowmerged="F"><Para appdisplaytext=" ">S.No </Para></CELL>
        <CELL rowmerged="F"> <Para appdisplaytext=" ">Name</Para></CELL>
        <CELL rowmerged="F"> <Para appdisplaytext=" ">Role</Para></CELL>
        <CELL colmerged="F"><Para appdisplaytext=" ">Comment</Para></CELL>
        </ROW>
        </THEAD>
        <TBODY editable="T">
        <ROW editable="F">
        <CELL rowmerged="T"><Para appdisplaytext=" ">S.No1 </Para></CELL>
        <CELL rowmerged="F"><Para appdisplaytext=" ">Name1</Para></CELL>
        <CELL rowmerged="F"><Para appdisplaytext=" ">Role1</Para></CELL>
        <CELL colmerged="F"><Para appdisplaytext=" ">Comment1</Para></CELL>
        </ROW>
        <ROW editable="F">
        <CELL rowmerged="T"><Para appdisplaytext=" "><refint>S.No1 </refint> </Para>      </CELL>      (We are getting ref int here.)
        <CELL rowmerged="F">        <Para appdisplaytext=" ">Name2</Para>      </CELL>
        <CELL rowmerged="F">        <Para appdisplaytext=" ">Role2</Para>      </CELL>      
        <CELL colmerged="F">        <Para appdisplaytext=" ">Comment2</Para>      </CELL>
        </ROW>
        <ROW editable="F">
        <CELL rowmerged="F">        <Para appdisplaytext=" ">S.No 3</Para>      </CELL>
        <CELL rowmerged="F">        <Para appdisplaytext=" ">Name3</Para>      </CELL>
        <CELL rowmerged="F">        <Para appdisplaytext=" ">Role3</Para>      </CELL>
        <CELL colmerged="F">        <Para appdisplaytext=" ">Comment3</Para>      </CELL>
        </ROW>
        <ROW editable="F">
        <CELL rowmerged="F">        <Para appdisplaytext=" ">S.No 4</Para>      </CELL>
        <CELL rowmerged="F">        <Para appdisplaytext=" ">Name4</Para>      </CELL>
        <CELL rowmerged="F">        <Para appdisplaytext=" ">Role4</Para>      </CELL>
        <CELL colmerged="F">        <Para appdisplaytext=" ">Comment4</Para>      </CELL>
        </ROW>
        </TBODY>
        </TABLE>

问题出现在这个模板中

 <xsl:template match="//TABLE//Para[not(normalize-space())][../@rowmerged='T']">
  <xsl:variable name="cellnum" select="count(../preceding-sibling::CELL) + 1"/>
  <xsl:variable name="matchingCells" select="../../preceding-sibling::ROW/CELL[$cellnum]/Para"/>
  <xsl:copy-of select="$matchingCells[normalize-space()][last()]"/>
 </xsl:template>

当您匹配 "empty" Para 元素时,其中 rowmerged 是 "T",然后您从前面的 [=16] 复制相应的 Para =].但是因为您正在使用 xsl:copy-of 这将复制它而无需任何进一步的转换。 xsl:copy-of 从输入树复制,并且不考虑您之前可能对该节点所做的任何转换(在输出中,而不是输入中)。

尝试使用 xsl:apply-templates 代替:

 <xsl:template match="//TABLE//Para[not(normalize-space())][../@rowmerged='T']">
  <xsl:variable name="cellnum" select="count(../preceding-sibling::CELL) + 1"/>
  <xsl:variable name="matchingCells" select="../../preceding-sibling::ROW/CELL[$cellnum]/Para"/>
  <xsl:apply-templates select="$matchingCells[normalize-space()][last()]"/>
 </xsl:template>

通过使用 xsl:apply-templates,它将在您此时选择的节点上应用任何变换。

编辑: 如果您只想复制 Para 节点的 children,请尝试复制 Para 节点的模板正在匹配,但从前一个兄弟复制 children。

 <xsl:template match="//TABLE//Para[not(normalize-space())][../@rowmerged='T']">
  <xsl:variable name="cellnum" select="count(../preceding-sibling::CELL) + 1"/>
  <xsl:variable name="matchingCells" select="../../preceding-sibling::ROW/CELL[$cellnum]/Para"/>
  <xsl:copy>
    <xsl:apply-templates select="@*" />
    <xsl:apply-templates select="$matchingCells[normalize-space()][last()]/node()"/>
  </xsl:copy>
 </xsl:template>