2013-05-31 5 views
1

У меня есть следующий очень большой XML-документ, который выглядит следующим образом. Я могу использовать пример, найденный в Интернете, чтобы разделить файл на несколько html-файлов.Разделить xml на несколько html-файлов с помощью xslt

Моя единственная проблема с результирующих файлов является то, что они должны включать <h1> тег и каждый элемент перед следующим <h1>, а затем получить следующий <h1> со следующими элементами и так далее, и так далее.

Поэтому в основном то, что мне нужно, чтобы быть в состоянии создать файл для <h1 id=h1> вместе со следующими элементами (<p>, <ol>, <pre>) В настоящее время, когда файлы создаются следующие элементы до следующего h1 тег не включен в созданных документов. И я не знаю, как настроить xslt для этого. Оригинальный XML

<?xml version="1.0" encoding="UTF-8"?> 

<paragraphs> 

<h1 id= "h1">Header One</h1> 

<p>The quick brown fox jumps over the lazy dog. </p> 

<p>The quick brown fox jumps over the lazy dog. </p> 

<p>The quick brown fox jumps over the lazy dog.</p> 
<ol> 
    <li> 
     List 1 
     </li> 
     <li> 
      List 2 
      </li> 

</ol> 

      <h1 id= "h2">Header Two</h1> 

      <p>The quick brown fox jumps over the lazy dog. </p> 

      <p>The quick brown fox jumps over the lazy dog.</p> 
      <ul> 
       <li> 
        List 3 
        </li 
       > 
        <li> 
         List 4 
         </li> 

      </ul> 

      <p>The quick brown fox jumps over the lazy dog.</p> 

      <h1 id= "h3">Header Three</h1> 

      <pre>my example one</pre> 

      <p>The quick brown fox jumps over the lazy dog.</p> 

      <pre> Another example</pre> 

</paragraphs> 

XSLT следуя примеру с сайта разработчиков IBM, расположенного здесь: http://www.ibm.com/developerworks/library/x-tipmultxsl/

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    version="2.0"> 

    <xsl:output method="text"/> 
    <xsl:output method="html" indent="yes" name="html"/> 

    <xsl:template match="/"> 
     <xsl:for-each select="//h1"> 
      <xsl:variable name="filename" 
       select="concat('output/',@id,'.html')" /> 
      <xsl:value-of select="$filename" /> <!-- Creating --> 
      <xsl:result-document href="{$filename}" format="html"> 
       <html><body> 
        <xsl:value-of select="text()"/> 
       </body></html> 
      </xsl:result-document> 
     </xsl:for-each> 
    </xsl:template> 
</xsl:stylesheet> 

Полученные файлы выглядеть следующим образом:

<html> 
    <body>Header One</body> 
    </html> 

<html> 
    <body>Header Two</body> 
    </html> 

<html> 
    <body>Header Three</body> 
    </html> 

Большое спасибо.

+0

по некоторым причинам я не могу правильно форматировать сообщение, пожалуйста, медведь со мной. – ManUO

ответ

1

Я думаю, что вы ищете что-то вроде этого ...

XML Input

<paragraphs> 
    <h1 id="h1">Header One</h1> 
    <p>The quick brown fox jumps over the lazy dog. </p> 
    <p>The quick brown fox jumps over the lazy dog. </p> 
    <p>The quick brown fox jumps over the lazy dog.</p> 
    <ol> 
     <li> List 1 </li> 
     <li> List 2 </li> 
    </ol> 
    <h1 id="h2">Header Two</h1> 
    <p>The quick brown fox jumps over the lazy dog. </p> 
    <p>The quick brown fox jumps over the lazy dog.</p> 
    <ul> 
     <li> List 3 </li> 
     <li> List 4 </li> 
    </ul> 
    <p>The quick brown fox jumps over the lazy dog.</p> 
    <h1 id="h3">Header Three</h1> 
    <pre>my example one</pre> 
    <p>The quick brown fox jumps over the lazy dog.</p> 
    <pre> Another example</pre> 
</paragraphs> 

XSLT 2,0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/*"> 
     <xsl:for-each-group select="*" group-starting-with="h1"> 
      <xsl:result-document href="output/{@id}.html"> 
       <html> 
        <body> 
         <xsl:copy-of select="current-group()"/> 
        </body> 
       </html> 
      </xsl:result-document> 
     </xsl:for-each-group> 
    </xsl:template> 

</xsl:stylesheet> 

выходных файлов

h1.html

<html> 
    <body> 
     <h1 id="h1">Header One</h1> 
     <p>The quick brown fox jumps over the lazy dog. </p> 
     <p>The quick brown fox jumps over the lazy dog. </p> 
     <p>The quick brown fox jumps over the lazy dog.</p> 
     <ol> 
     <li> List 1 </li> 
     <li> List 2 </li> 
     </ol> 
    </body> 
</html> 

h2.html

<html> 
    <body> 
     <h1 id="h2">Header Two</h1> 
     <p>The quick brown fox jumps over the lazy dog. </p> 
     <p>The quick brown fox jumps over the lazy dog.</p> 
     <ul> 
     <li> List 3 </li> 
     <li> List 4 </li> 
     </ul> 
     <p>The quick brown fox jumps over the lazy dog.</p> 
    </body> 
</html> 

h3.html

<html> 
    <body> 
     <h1 id="h3">Header Three</h1> 
     <pre>my example one</pre> 
     <p>The quick brown fox jumps over the lazy dog.</p> 
     <pre> Another example</pre> 
    </body> 
</html> 

Кроме того, если вам необходимо выполнить другие задачи преобразования вы можете добавьте преобразование идентичности и используйте xsl:apply-templates вместо xsl:copy-of. Затем вы можете добавить дополнительные шаблоны по мере необходимости.

Например, если вы хотите изменить все ol элементы ul вы могли бы сделать:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="/*"> 
     <xsl:for-each-group select="*" group-starting-with="h1"> 
      <xsl:result-document href="output/{@id}.html"> 
       <html> 
        <body> 
         <xsl:apply-templates select="current-group()"/> 
        </body> 
       </html> 
      </xsl:result-document> 
     </xsl:for-each-group> 
    </xsl:template> 

    <xsl:template match="ol"> 
     <ul> 
      <xsl:apply-templates select="@*|node()"/> 
     </ul> 
    </xsl:template> 

</xsl:stylesheet> 
+0

Спасибо @ daniel-haley, я получил работу как ожидалось. – ManUO

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