1

次の抜粋のような非常に大きな xml ドキュメントがあります。Web で見つかったいくつかの例を使用して、ファイルを複数の html ファイルに分割できます。

結果のファイルに関する私の唯一の問題は<h1>、次の前にタグとすべての要素を含めてから、次の要素などで<h1>次を取得する必要がある<h1>ことです。

したがって、基本的に必要なのは、次の要素 ( 、、 )<h1 id=h1>と一緒にファイルを生成できるようにすることです。現在、ファイルを作成するときに、次の h1 タグの前にある次の要素は、作成されたドキュメントに含まれていません。そして、それを行うためにxsltを調整する方法がわかりません。元のxml<p><ol><pre>

<?xml version="1.0" encoding="UTF-8"?>

<paragraphs>

<h1 id= "h1">Header One</h1>

<p>The quick brown fox jumps over the lazy dog. </p>

<p>The quick brown fox jumps over the lazy dog.  </p>

<p>The quick brown fox jumps over the lazy dog.</p>
<ol>
    <li>
        List 1
        </li>
        <li>
            List 2
            </li>

</ol>

            <h1 id= "h2">Header  Two</h1>

            <p>The quick brown fox jumps over the lazy dog. </p>

            <p>The quick brown fox jumps over the lazy dog.</p>
            <ul>
                <li>
                    List 3
                    </li
                >
                    <li>
                        List 4
                        </li>

            </ul>

            <p>The quick brown fox jumps over the lazy dog.</p>

            <h1 id= "h3">Header  Three</h1>

            <pre>my example one</pre>

            <p>The quick brown fox jumps over the lazy dog.</p>

            <pre> Another example</pre>

</paragraphs>  

次の IBM 開発者 Web サイトの例に続く xslt: http://www.ibm.com/developerworks/library/x-tipmultxsl/

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

    <xsl:output method="text"/>
    <xsl:output method="html" indent="yes" name="html"/>

    <xsl:template match="/">
        <xsl:for-each select="//h1">
            <xsl:variable name="filename"
                select="concat('output/',@id,'.html')" />
            <xsl:value-of select="$filename" />  <!-- Creating  -->
            <xsl:result-document href="{$filename}" format="html">
                <html><body>
                    <xsl:value-of select="text()"/>
                </body></html>
            </xsl:result-document>
        </xsl:for-each>
    </xsl:template>
</xsl:stylesheet>

結果のファイルは次のようになります。

<html>
    <body>Header One</body>
    </html>

<html>
    <body>Header Two</body>
    </html>

<html>
    <body>Header Three</body>
    </html>

どうもありがとう。

4

1 に答える 1

1

このようなものを探していると思います...

XML 入力

<paragraphs>
    <h1 id="h1">Header One</h1>
    <p>The quick brown fox jumps over the lazy dog. </p>
    <p>The quick brown fox jumps over the lazy dog. </p>
    <p>The quick brown fox jumps over the lazy dog.</p>
    <ol>
        <li> List 1 </li>
        <li> List 2 </li>
    </ol>
    <h1 id="h2">Header Two</h1>
    <p>The quick brown fox jumps over the lazy dog. </p>
    <p>The quick brown fox jumps over the lazy dog.</p>
    <ul>
        <li> List 3 </li>
        <li> List 4 </li>
    </ul>
    <p>The quick brown fox jumps over the lazy dog.</p>
    <h1 id="h3">Header Three</h1>
    <pre>my example one</pre>
    <p>The quick brown fox jumps over the lazy dog.</p>
    <pre> Another example</pre>
</paragraphs>

XSLT 2.0

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="/*">
        <xsl:for-each-group select="*" group-starting-with="h1">
            <xsl:result-document href="output/{@id}.html">
                <html>
                    <body>
                        <xsl:copy-of select="current-group()"/>
                    </body>
                </html>
            </xsl:result-document>
        </xsl:for-each-group>
    </xsl:template>

</xsl:stylesheet>

出力ファイル

h1.html

<html>
   <body>
      <h1 id="h1">Header One</h1>
      <p>The quick brown fox jumps over the lazy dog. </p>
      <p>The quick brown fox jumps over the lazy dog. </p>
      <p>The quick brown fox jumps over the lazy dog.</p>
      <ol>
         <li> List 1 </li>
         <li> List 2 </li>
      </ol>
   </body>
</html>

h2.html

<html>
   <body>
      <h1 id="h2">Header Two</h1>
      <p>The quick brown fox jumps over the lazy dog. </p>
      <p>The quick brown fox jumps over the lazy dog.</p>
      <ul>
         <li> List 3 </li>
         <li> List 4 </li>
      </ul>
      <p>The quick brown fox jumps over the lazy dog.</p>
   </body>
</html>

h3.html

<html>
   <body>
      <h1 id="h3">Header Three</h1>
      <pre>my example one</pre>
      <p>The quick brown fox jumps over the lazy dog.</p>
      <pre> Another example</pre>
   </body>
</html>

また、他の変換タスクを実行する必要がある場合は、恒等変換を追加して のxsl:apply-templates代わりに使用できますxsl:copy-of。その後、必要に応じてテンプレートを追加できます。

たとえば、すべてのol要素を次のように変更したい場合は、次のようにulします。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>
    <xsl:strip-space elements="*"/>

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

    <xsl:template match="/*">
        <xsl:for-each-group select="*" group-starting-with="h1">
            <xsl:result-document href="output/{@id}.html">
                <html>
                    <body>
                        <xsl:apply-templates select="current-group()"/>
                    </body>
                </html>
            </xsl:result-document>
        </xsl:for-each-group>
    </xsl:template>

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

</xsl:stylesheet>
于 2013-05-31T04:32:51.767 に答える