2016-02-09 5 views
0

В настоящее время я использую XSLT для очистки и изменения некоторого (экспортированного) HTML. До сих пор работает очень хорошо. ;)XSLT: перемещение дочернего узла после родительского узла

Но мне нужно изменить таблицу так, чтобы tfoot будет скопирован за пределами таблицы.

Input: (экспортируемые 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? Заранее спасибо.

+0

Почему бы вам просто не отредактировать HTML после экспорта? также 'tfoot' - это не то же самое, что' div.footer' – Aziz

+0

Это был просто упрощенный пример. ;) –

ответ

3

Try что-то вроде:

<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, поскольку он не имеет ни одного корневого элемента.

+0

Спасибо, это очень помогло мне. «Настоящая» разметка намного сложнее, я просто упростил ее для моего вопроса. –

Смежные вопросы