首页 > 解决方案 > 使用 XSLT 将 XML 拆分为多个 HTML 页面?

问题描述

我有一个 XML 文档。我想将这个单个文件转换为多个 HTML 文件。当我在代码ext:document内部使用时<xsl:template match="page/page">不起作用我做错了什么?

XML

<root>
<page>
    Page 1 INFO
</page>
<page>
    Page 2 INFO 
    <page>
        Page 3 INFO
    </page>
</page>
<page>
    Page 4 INFO
</page>

我的 XSLT

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="page">
  <ext:document href="page{position()}.html">
    <html>
        <head></head>
        <body><xsl:value-of select="."/></body>
    </html>
  </ext:document>
 </xsl:template>

 <xsl:template match="root/page/page">
  <ext:document href="pageTwo{position()}.html">
    <html>
        <head></head>
        <body><xsl:value-of select="."/></body>
    </html>
  </ext:document>
 </xsl:template>
</xsl:stylesheet>

page1.html

<html>
  <head></head>
  <body>
    Page 1 INFO
  </body>
</html>

page2.html

<html>
  <head></head>
  <body>
    Page 2 INFO
  </body>
</html>

page3.html

<html>
  <head></head>
  <body>
    Page 3 INFO
  </body>
</html>

page4.html

<html>
  <head></head>
  <body>
    Page 4 INFO
  </body>
</html>

标签: htmlxmlxslt

解决方案


你离得并不远。

  1. 看起来您只想要页面元素的文本而不是它的所有子元素(即排除页面节点)?所以你应该选择./text()而不是.在你的value-of.

  2. 您希望为所有页面元素递归地应用相同的模板,因此您需要apply-template在模板末尾添加一个 for 页面元素。

  3. position() 并不是您想要获得唯一编号的内容。相反,您想要计算所有前面和祖先页面元素。

像这样的东西:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:ext="http://exslt.org/common">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="page">
   <ext:document href="page{1 + count(ancestor::*[name() = 'page'] | preceding::*[name() = 'page'])}.html">
     <html>
       <head></head>
       <body><xsl:value-of select="./text()"/></body>
     </html>
   </ext:document>
   <xsl:apply-templates select="page"/>
 </xsl:template>

</xsl:stylesheet>

推荐阅读