代码之家  ›  专栏  ›  技术社区  ›  Boris Bojic

XSLT:将子节点移动到父节点之后

  •  1
  • Boris Bojic  · 技术社区  · 8 年前

    我目前正在使用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 回复  |  直到 8 年前
        1
  •  3
  •   michael.hor257k    8 年前

    尝试以下方法:

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