XSLT:在父节点之后移动子节点

XSLT: Move child node after parent node

我目前正在使用 XSLT 来清理和更改一些(导出的)HTML。到目前为止效果很好。 ;)

但我需要更改 table 以便将 tfoot 复制到 table 之外。

输入:(由 Adob​​e Indesign 导出):

<table>
<thead>
    <tr>
        <td>Stuff</td>
        <td>More Stuff</td>
    </tr>
</thead>
<tfoot>
    <tr>
        <td>Some footer things</td>
        <td>Even more footer</td>
    </tr>
</tfoot>
<tbody>
    <tr>
        <td>Stuff</td>
        <td>More Stuff</td>
    </tr>
</tbody>
</table>

我的预期输出:

<table>
<thead>
    <tr>
        <td>Stuff</td>
        <td>More Stuff</td>
    </tr>
</thead>
<tbody>
    <tr>
        <td>Stuff</td>
        <td>More Stuff</td>
    </tr>
</tbody>
</table>
<div class="footer">
    Some footer things
    Even more footer
</div>

我在 XSL 中做的第一件事是复制所有内容:

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

但下一步是什么?这甚至可以用 XSLT 实现吗?提前致谢。

试试这样的东西:

<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="*"/>

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

<xsl:template match="table">
    <xsl:copy>
        <xsl:apply-templates select="thead"/>
        <xsl:apply-templates select="tbody"/>
    </xsl:copy>
    <xsl:apply-templates select="tfoot"/>
</xsl:template>

<xsl:template match="tfoot">
    <div class="footer">
        <xsl:apply-templates select="tr/td/text()"/>
    </div>
</xsl:template>

</xsl:stylesheet>

我不确定您要如何安排页脚的内容div;您可能想使用 xsl:for-each 在文本节点之间插入分隔符。

另请注意,此处的结果格式不正确 XML,因为它没有单个根元素。