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

时间:2016-02-09 16:15:50

标签: html xml xslt parent

我目前正在使用XSLT来清理和修改某些(导出的)HTML。到目前为止工作得很好。 ;)

但是我需要改变一个表,以便将tfoot复制到表外。

输入:(由Adobe 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吗?提前谢谢。

1 个答案:

答案 0 :(得分:3)

尝试类似:

<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,因为它没有单个根元素。