2015-01-22 2 views
0

Мне нужно разбить файл HTML на несколько файлов HTML, используя h1 node в качестве разделителя файлов.
Exemple:XSL Split файл от узла к узлу

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <meta http-equiv="Content-Style-Type" content="text/css" /> 
     <title>Test</title> 
     <style type="text/css">body { font-family:Helvetica; font-size:9pt }}</style> 
    </head> 
    <body> 
     <div> 
      <p><span>This is my frontpage</span></p> 
      <div><img src="images/frontpage.png" width="100" height="50" style="border:none" /></div> 
     </div> 
     <div> 
      <h1> Title 1 </h1><p> some blabla for title_1 </p> 
      <h2> Title 1.1 </h2><p> some blabla for title_1_1 </p><img src="images/title_1_1.png" width="50" height="50"/> 
      <h1> Title 2 </h1><p> some blabla for title_2 </p> 
     </div> 
     <div> 
      <p> other blabla </p> 
      <h1> Title 3 </h1><p> some blabla for title_3 </p> 
     </div> 
    </body> 
</html> 

Я хочу 4 выхода.

frontpage.html:

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <meta http-equiv="Content-Style-Type" content="text/css" /> 
     <title>Test</title> 
     <style type="text/css">body { font-family:Helvetica; font-size:9pt }}</style> 
    </head> 
    <body> 
     <div> 
      <p><span>This is my frontpage</span></p> 
      <div><img src="images/frontpage.png" width="100" height="50" style="border:none" /></div> 
     </div> 
    </body> 
</html> 

output1.html:

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <meta http-equiv="Content-Style-Type" content="text/css" /> 
     <title>Test</title> 
     <style type="text/css">body { font-family:Helvetica; font-size:9pt }}</style> 
    </head> 
    <body> 
     <div> 
      <h1> Title 1 </h1><p> some blabla for title_1 </p> 
      <h2> Title 1.1 </h2><p> some blabla for title_1_1 </p><img src="images/title_1_1.png" width="50" height="50"/> 
     </div> 
    </body> 
</html> 

output2.html:

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <meta http-equiv="Content-Style-Type" content="text/css" /> 
     <title>Test</title> 
     <style type="text/css">body { font-family:Helvetica; font-size:9pt }}</style> 
    </head> 
    <body> 
     <div> 
      <h1> Title 2 </h1><p> some blabla for title_2 </p> 
     </div> 
     <div> 
      <p> other blabla </p> 
     </div> 
    </body> 
</html> 

output3.html

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <meta http-equiv="Content-Style-Type" content="text/css" /> 
     <title>Test</title> 
     <style type="text/css">body { font-family:Helvetica; font-size:9pt }}</style> 
    </head> 
    <body> 
     <div> 
      <h1> Title 3 </h1><p> some blabla for title_3 </p> 
     </div> 
    </body> 
</html> 

Буду признателен за любую идею для решения этой проблемы.

PS: Я использую XSLT 2.0 и Saxon 8

+1

Рассмотрите возможность создания хорошо сформированных образцов XML, а не псевдокода. –

+0

@MartinHonnen Да, я не знал, как использовать редактор для добавления HTML-кода. Извините, что – dgedge03

+0

@ dg99 Я пробовал код, но результат не был тем, кого я ожидал. – dgedge03

ответ

1

Заметьте, что Saxon 8 несколько лет и версии, прежде чем 8.9 не соответствуют спецификации XSLT 2.0, но более ранние проекты.

Ниже приводится XSLT 2.0 таблицы стилей протестирована с Saxon 9.6:

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    exclude-result-prefixes="xs"> 

<xsl:output method="html" version="4.01" indent="yes"/> 

<xsl:template match="/"> 
    <xsl:for-each-group select="//h1 | //text()[not(ancestor::h1)] | //*[not(*) and not(ancestor::h1)]" group-starting-with="h1"> 
    <xsl:variable name="copy" select="current-group()"/> 
    <xsl:variable name="ancestors" select="$copy/ancestor::*"/> 
    <xsl:variable name="filename" select="if (not(self::h1)) then 'frontpage.html' else concat('output', position() - 1, '.html')"/> 
    <xsl:result-document href="{$filename}"> 
     <xsl:apply-templates select="/*"> 
     <xsl:with-param name="copy" select="$copy"/> 
     <xsl:with-param name="ancestors" select="$ancestors"/> 
     </xsl:apply-templates> 
    </xsl:result-document> 
    </xsl:for-each-group> 
</xsl:template> 

<xsl:template match="node()"> 
    <xsl:param name="copy"/> 
    <xsl:param name="ancestors"/> 
    <xsl:choose> 
    <xsl:when test="$copy[. is current()]"> 
     <xsl:copy-of select="."/> 
    </xsl:when> 
    <xsl:when test="$ancestors[. is current()]"> 
     <xsl:copy> 
     <xsl:copy-of select="@*"/> 
     <xsl:apply-templates> 
      <xsl:with-param name="copy" select="$copy"/> 
      <xsl:with-param name="ancestors" select="$ancestors"/> 
     </xsl:apply-templates> 
     </xsl:copy> 
    </xsl:when> 
    </xsl:choose> 
</xsl:template> 

<xsl:template match="head"> 
    <xsl:copy-of select="."/> 
</xsl:template> 

</xsl:stylesheet> 

При нанесении на входной файл

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <meta http-equiv="Content-Style-Type" content="text/css" /> 
     <title>Test</title> 
     <style type="text/css">body { font-family:Helvetica; font-size:9pt }}</style> 
    </head> 
    <body> 
     <div> 
      <p><span>This is my frontpage</span></p> 
      <div><img src="images/frontpage.png" width="100" height="50" style="border:none" /></div> 
     </div> 
     <div> 
      <h1> Title 1 </h1><p> some blabla for title_1 </p> 
      <h2> Title 1.1 </h2><p> some blabla for title_1_1 </p><img src="images/title_1_1.png" width="50" height="50"/> 
      <h1> Title 2 </h1><p> some blabla for title_2 </p> 
     </div> 
     <div> 
      <p> other blabla </p> 
      <h1> Title 3 </h1><p> some blabla for title_3 </p> 
     </div> 
    </body> 
</html> 

он создает четыре выходных файлов

<html> 

    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 


     <meta http-equiv="Content-Style-Type" content="text/css"> 

     <title>Test</title> 
     <style type="text/css">body { font-family:Helvetica; font-size:9pt }}</style> 
     </head> 

    <body> 

     <div> 

     <p><span>This is my frontpage</span></p> 

     <div><img src="images/frontpage.png" width="100" height="50" style="border:none"></div> 

     </div> 

     <div> 

     </div> 
    </body> 
</html> 

и

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 


     <meta http-equiv="Content-Style-Type" content="text/css"> 

     <title>Test</title> 
     <style type="text/css">body { font-family:Helvetica; font-size:9pt }}</style> 
     </head> 
    <body> 
     <div> 
     <h1> Title 1 </h1> 
     <p> some blabla for title_1 </p> 

     <h2> Title 1.1 </h2> 
     <p> some blabla for title_1_1 </p><img src="images/title_1_1.png" width="50" height="50"> 

     </div> 
    </body> 
</html> 

и

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 


     <meta http-equiv="Content-Style-Type" content="text/css"> 

     <title>Test</title> 
     <style type="text/css">body { font-family:Helvetica; font-size:9pt }}</style> 
     </head> 
    <body> 
     <div> 
     <h1> Title 2 </h1> 
     <p> some blabla for title_2 </p> 

     </div> 

     <div> 

     <p> other blabla </p> 

     </div> 
    </body> 
</html> 

и

<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 


     <meta http-equiv="Content-Style-Type" content="text/css"> 

     <title>Test</title> 
     <style type="text/css">body { font-family:Helvetica; font-size:9pt }}</style> 
     </head> 
    <body> 
     <div> 
     <h1> Title 3 </h1> 
     <p> some blabla for title_3 </p> 

     </div> 

    </body> 

</html> 

, так что я думаю, что таблица стилей разделяет узлы по мере необходимости и создает нужное содержимое файла, вам нужно будет экспериментировать с белым пространством вскрышных и отступов.

+0

Спасибо за этот ответ, я попробую его и отправлю отзыв. Когда я запускаю свой саксонский JAR, он говорит 'Saxon 8.8J от Saxonica' – dgedge03

+0

. Последняя версия Saxon 9.6 доступна в версии с открытым исходным кодом с http://saxon.sourceforge.net/ –

+0

Хорошо, спасибо. Я попробую. Я изменяю свою первую потребность, чтобы соответствовать моей реальной потребности. (Я надеялся, что смогу адаптировать свой ответ ...). – dgedge03