2

我正在寻找一种将 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。

4

3 回答 3

2

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>

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>

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:

    <?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>

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.

于 2012-08-28T13:49:45.760 回答
1

要在单个 XSLT 转换中创建多个 HTML 文件,您将需要 xsl:result-document 指令,该指令仅在 XSLT 2.0 中可用。不幸的是,你没有用 ruby​​-xslt 做到这一点。

于 2012-08-28T13:57:20.007 回答
0

XSLT 1.0 转换只能创建一个输出

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

我强烈建议您使用 XSLT 2.0 来完成这项任务——这可以使用新xsl:result-document指令轻松完成。

于 2012-08-28T14:02:07.620 回答