为以下场景编写xslt

为以下场景编写xslt,xslt,Xslt,输入xml: <?xml version="1.0"?> <TABLE> <THEAD> <ROW id="rh"> <CELL rowmerged="F" rowspan="1" > <Para >A</Para> </CELL> <CELL rowmerged="F" rowspan="1" >

输入xml:

<?xml version="1.0"?>
<TABLE>
<THEAD>
    <ROW id="rh">
        <CELL rowmerged="F"  rowspan="1" >
            <Para >A</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >B</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >C</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >D</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >F</Para>
        </CELL>
    </ROW>


</THEAD>
<TBODY editable="T">
    <ROW id="r1">
        <CELL rowmerged="T"  rowspan="2" >
            <Para >11</Para>
        </CELL>
        <CELL rowmerged="T"  rowspan="2" >
            <Para >12</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >13</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >14</Para>
        </CELL>
        <CELL rowmerged="T"  rowspan="2" >
            <Para >15</Para>
        </CELL>
    </ROW>

    <ROW id="r2">
        <CELL rowmerged="T"  rowspan="2" >
            <Para ></Para>
        </CELL>
        <CELL rowmerged="T"  rowspan="2" >
            <Para ></Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >23</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >24</Para>
        </CELL>
        <CELL rowmerged="T"  rowspan="2" >
            <Para ></Para>
        </CELL>
    </ROW>

    <ROW id="r3">
        <CELL rowmerged="T"  rowspan="2" >
            <Para ></Para>
        </CELL>
        <CELL rowmerged="T"  rowspan="2" >
            <Para ></Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >33</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >34</Para>
        </CELL>
        <CELL rowmerged="T"  rowspan="2" >
            <Para ></Para>
        </CELL>
    </ROW>

    <ROW id="r4">
        <CELL rowmerged="F"  rowspan="1" >
            <Para >41</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >42</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >43</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >44</Para>
        </CELL>
        <CELL rowmerged="T"  rowspan="1" >
            <Para >45</Para>
        </CELL>
    </ROW>
</TBODY>
</TABLE>

A.
B
C
D
F
11
12
13
14
15
23
24
33
34
41
42
43
44
45
规则: 对于合并行:将主合并单元格的内容复制到合并行中的其他单元格。 预期结果:

<?xml version="1.0"?>
<TABLE>
<THEAD>
    <ROW id="rh">
        <CELL rowmerged="F"  rowspan="1" >
            <Para >A</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >B</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >C</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >D</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >F</Para>
        </CELL>
    </ROW>


</THEAD>
<TBODY editable="T">
    <ROW id="r1">
        <CELL rowmerged="F"  rowspan="1" >
            <Para >11</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >12</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >13</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >14</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan=1" >
            <Para >15</Para>
        </CELL>
    </ROW>

    <ROW id="r2">
        <CELL rowmerged="F"  rowspan="1" >
            <Para >11</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >12</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >23</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >24</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >15</Para>
        </CELL>
    </ROW>

    <ROW id="r3">
        <CELL rowmerged="F"  rowspan="1" >
            <Para >11</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >12</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >33</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >34</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >15</Para>
        </CELL>
    </ROW>

    <ROW id="r4">
        <CELL rowmerged="F"  rowspan="1" >
            <Para >41</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >42</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >43</Para>
        </CELL>
        <CELL rowmerged="F"  rowspan="1" >
            <Para >44</Para>
        </CELL>
        <CELL rowmerged="T"  rowspan="1" >
            <Para >45</Para>
        </CELL>
    </ROW>
</TBODY>
</TABLE>

A.
B
C
D
F
11
12
13
14

您尚未在问题中详细说明规则,但在我看来,如果对于
rowmerged=“t”
Para
为空的任何单元格,您从最近的前一行中的相应单元格复制
Para
,则可以实现您要求的输出

您可以像往常一样从标识模板开始,该模板默认情况下复制所有未更改的内容,但允许您覆盖特定节点的此行为:

  <xsl:template match="@*|node()">
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
  </xsl:template>
对于行合并单元格中的空
Para

  <xsl:template match="Para[not(normalize-space())][../@rowmerged='T']">

我们希望找到匹配单元格不为空的最近的前一行,并复制该行

    <!-- find the number of this cell in the current row -->
    <xsl:variable name="cellnum" select="count(../preceding-sibling::CELL) + 1" />
    <!-- look for the corresponding Para in previous rows -->
    <xsl:variable name="matchingCells" select="
        ../../preceding-sibling::ROW/CELL[$cellnum]/Para" />
    <!-- filter for just the non-empty ones, and copy the nearest (last in doc order) -->
    <xsl:copy-of select="$matchingCells[normalize-space()][last()]" />

完整的样式表如下所示:

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

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

  <xsl:template match="CELL">
    <CELL rowmerged="F" rowspan="1">
      <xsl:apply-templates select="node()"/>
    </CELL>
  </xsl:template>

  <xsl:template match="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:stylesheet>


请参考:可能重复我尝试过的解决方案,但这不起作用感谢robert对你的宝贵支持。@Sent Hilnathan当你得到解决问题的答案时,说“谢谢”的堆栈溢出方式是单击左侧的勾号接受答案。当你的声望提高一点时,你也可以投票选出好的答案(和问题)。如果行合并为true,并且单元格中的Para值为空,则转换后该行变为空。请参阅
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

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

  <xsl:template match="CELL">
    <CELL rowmerged="F" rowspan="1">
      <xsl:apply-templates select="node()"/>
    </CELL>
  </xsl:template>

  <xsl:template match="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:stylesheet>