我正在寻找一种方法将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>
现在我想将此xml文件拆分为不同的HTML文件,其中包含XML文件中的特定范围。例如,每个HTML文件应包含XML中的3行。
table1.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>
table2.html
<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>
有人知道如何格式化XSLT文件吗?我正在使用ruby-xslt加载XML和XSLT文件,并将整个内容转换为HTML。
答案 0 :(得分:2)
如果将此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>
OUTPUT 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>
如果您通过此XSLT运行OUTPUT 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>
最终OUTPUT XML:
<?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>
在我看来,只要您有机会在输入XML上运行2个样式表,这应该适用于XSLT 1.0。
祝你好运, 彼得
答案 1 :(得分:1)
要在单个XSLT转换中创建多个HTML文件,您将需要xsl:result-document指令,该指令仅在XSLT 2.0中可用。不幸的是,你没有用ruby-xslt得到它。
答案 2 :(得分:0)
XSLT 1.0转换只能创建一个输出。
您可能仍然只有一个包含所有生成的表的结果。然后,您需要在XSLT之外处理此结果(或对其执行N次转换),以便生成所需的N个单独输出。
我强烈建议您使用XSLT 2.0执行此任务 - 这可以使用新的xsl:result-document
指令轻松完成。