XSLT:在父节点之后移动子节点
XSLT: Move child node after parent node
我目前正在使用 XSLT 来清理和更改一些(导出的)HTML。到目前为止效果很好。 ;)
但我需要更改 table 以便将 tfoot 复制到 table 之外。
输入:(由 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 实现吗?提前致谢。
试试这样的东西:
<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,因为它没有单个根元素。
我目前正在使用 XSLT 来清理和更改一些(导出的)HTML。到目前为止效果很好。 ;)
但我需要更改 table 以便将 tfoot 复制到 table 之外。
输入:(由 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 实现吗?提前致谢。
试试这样的东西:
<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,因为它没有单个根元素。