使用XSLT将XML分割成多个HTML文件 [英] Split XML into multiple HTML files using XSLT
问题描述
一个例子xml:
p>
An example 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行。
Now I want to split this xml file into different HTML files which contain a specific range from the XML file. Each HTML file should contain 3 rows from the XML for example.
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 。
Anyone an idea how the XSLT file needs to be formatted? I'm using ruby-xslt to load the XML and XSLT file and convert the whole thing to HTML.
推荐答案
如果您将此XSLT应用于您的输入XML,它会将XML分成包含3条记录的表:
If you apply this XSLT to your input XML it will split the XML into tables containing 3 records:
<?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:
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,您将得到想要的结果:
If you run the OUTPUT XML through this XSLT you will get the wanted result:
<?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>
final OUTPUT XML:
final 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>
在我看来,只要您有机会运行2个样式表,就可以使用XSLT 1.0您的输入XML。
In my opinion this should work with XSLT 1.0 as long as you have the opportunity to run 2 stylesheets on your input XML.
祝好,
彼得
这篇关于使用XSLT将XML分割成多个HTML文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!