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ファイルを、XMLファイルの特定の範囲を含むさまざまなHTMLファイルに分割します。たとえば、各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

この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>

このXSLTを介してOUTPUTXMLを実行すると、目的の結果が得られます。

<?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>
    <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つのスタイルシートを実行する機会がある限り、これはXSLT1.0で機能するはずです。

于 2012-08-28T13:49:45.760 に答える
1

1つのXSLT変換で複数のHTMLファイルを作成するには、xsl:result-document命令が必要です。これは、XSLT2.0でのみ使用できます。残念ながら、ruby-xsltではそれが得られません。

于 2012-08-28T13:57:20.007 に答える
0

XSLT 1.0変換では、単一の出力しか作成できません

生成されたすべてのテーブルを含む単一の結果がまだある場合があります。次に、必要なN個の個別の出力を生成するために、この結果をXSLTの外部で処理する(またはXSLTでN個の変換を実行する)必要があります。

このタスクにはXSLT2.0を使用することを強くお勧めしますxsl:result-document。これは、新しい命令を使用して簡単に実行できます。

于 2012-08-28T14:02:07.620 に答える