Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XSLT将XML拆分为多个HTML文件_Html_Ruby_Xml_Xslt - Fatal编程技术网

使用XSLT将XML拆分为多个HTML文件

使用XSLT将XML拆分为多个HTML文件,html,ruby,xml,xslt,Html,Ruby,Xml,Xslt,我正在寻找一种将XML文件拆分为多个HTML文件的方法,这些文件最终应该包含一个表 xml示例: <?xml version="1.0" encoding="ISO-8859-1"?> <table> <row> <name>user1</name> <email>email1</email> </row> <row> <name>user

我正在寻找一种将XML文件拆分为多个HTML文件的方法,这些文件最终应该包含一个表

xml示例:

<?xml version="1.0" encoding="ISO-8859-1"?>

<table>
  <row>
    <name>user1</name>
    <email>email1</email>
  </row>
  <row>
    <name>user2</name>
    <email>email2</email>
  </row>
  <row>
   <name>user3</name>
   <email>email3</email>
  </row>
  <row>
    <name>user4</name>
    <email>email4</email>
  </row>
  <row>
    <name>user5</name>
    <email>email5</email>
  </row>

  ...

</table>

用户1
电子邮件1
用户2
电子邮件2
用户3
电邮3
用户4
电子邮件4
用户5
电子邮件5
...
现在,我想将这个xml文件拆分为不同的HTML文件,其中包含xml文件的特定范围。例如,每个HTML文件应该包含来自XML的3行

表1.html

<table>
  <tr>
    <td>user1</td>
    <td>email1</td>
  </tr>
  <tr>
    <td>user2</td>
    <td>email2</td>
  </tr>
  <tr>
    <td>user3</td>
    <td>email3</td>
  </tr>
</table>
<table>
  <tr>
    <td>user4</td>
    <td>email4</td>
  </tr>
  <tr>
    <td>user5</td>
    <td>email5</td>
  </tr>
  <tr>
    <td>user6</td>
    <td>email6</td>
  </tr>
</table>

用户1
电子邮件1
用户2
电子邮件2
用户3
电邮3
表2.html

<table>
  <tr>
    <td>user1</td>
    <td>email1</td>
  </tr>
  <tr>
    <td>user2</td>
    <td>email2</td>
  </tr>
  <tr>
    <td>user3</td>
    <td>email3</td>
  </tr>
</table>
<table>
  <tr>
    <td>user4</td>
    <td>email4</td>
  </tr>
  <tr>
    <td>user5</td>
    <td>email5</td>
  </tr>
  <tr>
    <td>user6</td>
    <td>email6</td>
  </tr>
</table>

用户4
电子邮件4
用户5
电子邮件5
用户6
电子邮件6

有人知道XSLT文件需要如何格式化吗?我正在使用加载XML和XSLT文件,并将整个内容转换为HTML。

如果将此XSLT应用于输入XML,它会将XML拆分为包含3条记录的表:

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

<xsl:strip-space elements="*"/>
<xsl:output indent="yes" method="xml"/>

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>
<!-- split file up into row elements -->
<xsl:template match="row[position() mod 3 = 1]">
    <table>
        <xsl:copy-of select=".|following-sibling::row[not(position() > 2)]"/>
    </table>
</xsl:template>

<xsl:template match="row"/>
</xsl:stylesheet>

输出XML:

<?xml version="1.0" encoding="UTF-8"?>
<table>
<table>
    <row>
        <name>user1</name>
        <email>email1</email>
    </row>
    <row>
        <name>user2</name>
        <email>email2</email>
    </row>
    <row>
        <name>user3</name>
        <email>email3</email>
    </row>
</table>
<table>
    <row>
        <name>user4</name>
        <email>email4</email>
    </row>
    <row>
        <name>user5</name>
        <email>email5</email>
    </row>
</table>
</table>
    <?xml version="1.0" encoding="UTF-8"?><table>
<table>
    <tr>
        <td>user1</td>
        <td>email1</td>
    </tr>
    <tr>
        <td>user2</td>
        <td>email2</td>
    </tr>
    <tr>
        <td>user3</td>
        <td>email3</td>
    </tr>
</table>
<table>
    <tr>
        <td>user4</td>
        <td>email4</td>
    </tr>
    <tr>
        <td>user5</td>
        <td>email5</td>
    </tr>
</table>
</table>

用户1
电子邮件1
用户2
电子邮件2
用户3
电邮3
用户4
电子邮件4
用户5
电子邮件5
如果通过此XSLT运行输出XML,您将得到想要的结果:

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

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

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

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


</xsl:stylesheet>

最终输出XML:

<?xml version="1.0" encoding="UTF-8"?>
<table>
<table>
    <row>
        <name>user1</name>
        <email>email1</email>
    </row>
    <row>
        <name>user2</name>
        <email>email2</email>
    </row>
    <row>
        <name>user3</name>
        <email>email3</email>
    </row>
</table>
<table>
    <row>
        <name>user4</name>
        <email>email4</email>
    </row>
    <row>
        <name>user5</name>
        <email>email5</email>
    </row>
</table>
</table>
    <?xml version="1.0" encoding="UTF-8"?><table>
<table>
    <tr>
        <td>user1</td>
        <td>email1</td>
    </tr>
    <tr>
        <td>user2</td>
        <td>email2</td>
    </tr>
    <tr>
        <td>user3</td>
        <td>email3</td>
    </tr>
</table>
<table>
    <tr>
        <td>user4</td>
        <td>email4</td>
    </tr>
    <tr>
        <td>user5</td>
        <td>email5</td>
    </tr>
</table>
</table>

用户1
电子邮件1
用户2
电子邮件2
用户3
电邮3
用户4
电子邮件4
用户5
电子邮件5
在我看来,只要您有机会在输入XML上运行两个样式表,XSLT1.0就可以使用这种方法

致以最良好的祝愿,
Peter

要在一次XSLT转换中创建多个HTML文件,您需要xsl:result文档说明,该说明仅在XSLT 2.0中可用。不幸的是,ruby xslt无法实现这一点。

XSLT1.0转换只能创建一个输出

您可能仍然有一个包含所有生成表的结果。然后,您需要在XSLT之外处理这个结果(或对其执行N个转换),以便生成所需的N个单独的输出

我强烈建议您使用XSLT 2.0完成此任务——使用新的指令可以轻松完成此任务