2013-05-31 75 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輸入

<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