3

巨大なXMLドキュメントを複数のHTMLドキュメントに変換する必要があります。XMLは次のとおりです。

<society>
  <party_members>
    <member id="1" first_name="" last_name="O'Brien">
      <ministry_id>1</ministry_id>
      <ministry_id>3</ministry_id>
    </member>
    <member id="2" first_name="Julia" last_name="">
      <ministry_id>2</ministry_id>
    </member>
    <member id="3" first_name="Winston" last_name="Smith">
      <ministry_id>1</ministry_id>
    </member>
  </party_members>
  <ministries>
    <ministry>
      <id>1</id>
      <short_title>Minitrue</short_title>
      <long_title>Ministry of truth</long_title>
      <concerns>News, entertainment,education and arts </concerns>      
    </ministry>
    <ministry>
      <id>2</id>
      <short_title>Minipax</short_title>
      <long_title>Ministry of Peace</long_title>
      <concerns>War</concerns>
    </ministry>
    <ministry>
      <id>3</id>
      <short_title>Minilove</short_title>
      <long_title>Ministry of Love</long_title>
      <concerns>Dissidents</concerns>      
    </ministry>
  </ministries>
</society>

党員の潜在的な数が非常に多くなる可能性がある場合(数百万人)、省庁の数は少なく、約300〜400人です。パーティメンバーごとに、次のコンテンツを含む出力HTMLが必要です。

<html>  
  <body>
    <h2>Party member: Winston Smith</h2>
    <h3>Works in:</h3>
    <div class="ministry">
      <h4>Ministry of truth</h4> - Minitrue
      <h5>Ministry of truth <i>concerns</i> itself with <i>News, entertainment,education and arts</i></h5>  
    </div>
  </body>
</html>

出力ドキュメントの数は、==パーティメンバーの数である必要があります。

現在XSLTに苦労していますが、XSLTを機能させることができません。

XSLTがこのジョブに適しているかどうかを判断するのを手伝ってください。そうである場合は、XSLTを実装する方法、どのXSLT構造を使用する必要があるかなどを教えてください。

もちろん、手続き型言語でミニ変換を書くこともできますが、手続き型の解析や変更ではなく、「変換テンプレートの適用」アプローチを探して、テンプレートを他のユーザーに渡してさらに変更できるようにします(CSS、フォーマット等)。

私はruby+nokogiri(libxsltへのバインディングのセットです)を使用していますが、任意の言語を使用できます。

XSTLがこのタスクに適していない場合、メモリ消費量を少なくして数分で最大100万人のユーザーを変換する必要がある場合、ここで他にどのような機器を使用できますか?

追加の利点は、処理を並列化できることです。

ありがとうございました。

4

5 に答える 5

3

純粋なXSLT1.0では、1つの変換で複数の結果ドキュメントを作成することはできません。そのためには、XSLT2.0命令でSaxon9やAltovaXMLなどのXSLT2.0プロセッサを使用するか、 http:[xsl:result-document][1] //www.exslt.org/exsl/elements/documentを実装するxsltproc/libxsltなどのXSLT1.0プロセッサを使用する必要があります。 /index.html。それらの1つを使用できる場合は、XSLTがタスクに適しています。

[編集]それぞれlibxsltでxsltproc次のスタイルシートコード

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:exsl="http://exslt.org/common"
  exclude-result-prefixes="exsl"
  extension-element-prefixes="exsl"
  version="1.0">

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

<xsl:key name="ministry-by-id" match="ministry" use="id"/>

<xsl:template match="/">
  <xsl:apply-templates select="society/party_members/member" mode="doc"/>
</xsl:template>

<xsl:template match="member" mode="doc">
  <exsl:document href="member{@id}.xml">
    <html>
      <body>
        <h2>Party member: <xsl:value-of select="concat(@first_name, ' ', @last_name)"/></h2>
        <h3>Works in</h3>
        <xsl:apply-templates select="key('ministry-by-id', ministry_id)"/>
      </body>
    </html>
  </exsl:document>
</xsl:template>

<xsl:template match="ministry">
  <div class="ministry">
    <h4><xsl:value-of select="long_title"/></h4>
    <h5><xsl:value-of select="long_title"/> <i>concerns</i> itself with <i><xsl:value-of select="concerns"/></i></h5>
  </div>
</xsl:template>

</xsl:stylesheet>

exsl:documentは、1つの変換で複数の結果ドキュメントを出力するために使用する方法を示しています。また、キーを使用してパフォーマンスを向上させます。そのコードが膨大な入力データに対して機能するかどうかをお知らせください。

于 2012-10-25T12:04:22.187 に答える
2

この結果(いくつかのhtmlファイルを生成する)を達成するには、XSLT2.0が絶対に必要です。そのためにSaxonの使用をお勧めします。

ここに、必要なものを生成するサンプルXSLがあります(メンバーごとに単一のhtmlファイルを作成し、すべてシステムのルートの「html」フォルダー内に作成し、作成したもののレポートを返します)。おそらく、ニーズに合わせて少し調整する必要があります。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes" method="html"/>
    <xsl:variable name="target-dir" select="'/html'"/>
    <xsl:key name="ministries" match="/society/ministries/ministry" use="id"/>
    <xsl:strip-space elements="*"/>
    <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
    <xsl:template match="/">
        <Output>
            <xsl:apply-templates select="*"/>
        </Output>
    </xsl:template>
    <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
    <xsl:template match="*">
        <xsl:apply-templates select="*"/>
    </xsl:template>
    <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
    <xsl:template match="member">
        <Html path="{concat($target-dir,'/',@id,'.html')}">
            <xsl:result-document href="{concat($target-dir,'/',@id,'.html')}">
                <html>
                  <body>
                    <h2><xsl:value-of select="concat('Party member: ',@first_name,' ',@last_name)"/></h2>
                    <h3>Works in:</h3>
                    <xsl:apply-templates select="ministry_id"/>
                  </body>
                </html>
            </xsl:result-document>
        </Html>
    </xsl:template>
    <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
    <xsl:template match="ministry_id">
    <xsl:variable name="ministry" select="key('ministries',.)"/>
    <div class="ministry">
        <h4><xsl:value-of select="$ministry/long_title"/></h4> - <xsl:value-of select="$ministry/short_title"/>
        <h5><xsl:value-of select="$ministry/long_title"/> <i>concerns</i> itself with <i><xsl:value-of select="$ministry/concerns"/></i></h5>
    </div>
    </xsl:template>
</xsl:stylesheet>

そして、ここにサンプル出力があります:

<html>
   <body>
      <h2>Party member:  O'Brien</h2>
      <h3>Works in:</h3>
      <div class="ministry">
         <h4>Ministry of truth</h4> - Minitrue
         <h5>Ministry of truth<i>concerns</i> itself with <i>News, entertainment,education and arts </i></h5>
      </div>
      <div class="ministry">
         <h4>Ministry of Love</h4> - Minilove
         <h5>Ministry of Love<i>concerns</i> itself with <i>Dissidents</i></h5>
      </div>
   </body>
</html>

パフォーマンスに関しては、数百万は大量のデータです。xslで十分だと思いますが、確実に知る前に試してみる必要があると思います。

これがお役に立てば幸いです。

于 2012-10-25T12:29:37.413 に答える
1

Martinが言うように、すべてのHTML抜粋を含む1つのドキュメントしか作成できませんが、作業の大部分はXSLT1.0で確実に実行できます。これから、XPathテクノロジーを使用して各htmlノードを選択し、各ノードのOuterXmlを返し、ファイル/データベースなどに書き留めることができます。

ただし、メモリの制約により、すべてのパーティメンバーを一度に処理することはできない場合があります。

パーティメンバーは他のメンバー(省庁のみ)に依存しないため、XMLドキュメントにすべてのミニストリーが存在する状態で、パーティメンバーを一度に1000程度処理することをお勧めします。省庁を個別のxmlファイルに分割し、各xsl:documentパーティメンバーのxmlファイルの処理中に省庁をロードするために使用することもできます。

編集xsl:document参照、および使用例はこちら

次のXSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                version="1.0"
                >

    <xsl:output method="xml" omit-xml-declaration="no" indent="yes" />

    <xsl:template match="/society">
        <root>
            <xsl:apply-templates select="party_members/member" />
        </root>
    </xsl:template>

    <xsl:template match="member">
        <html>
            <body>
                <h2>
                    Party member: <xsl:value-of select="@first_name"/><xsl:text xml:space="preserve"> </xsl:text><xsl:value-of select="@last_name"/>
                </h2>
                <h3>Works in:</h3>
                <div class="ministry">
                    <xsl:for-each select="ministry_id">
                        <xsl:variable name="ministryId" select="./text()" />
                        <xsl:apply-templates select="/society/ministries/ministry[id=$ministryId]" mode="partymember"/>
                    </xsl:for-each>
                </div>
            </body>
        </html>
    </xsl:template>

    <xsl:template match="ministry" mode="partymember">
        <h4>
            <xsl:value-of select="long_title"/>
        </h4> -     <xsl:value-of select="short_title"/>
        <h5>
            <xsl:value-of select="long_title"/><i>concerns</i> itself with <i>
                <xsl:value-of select="concerns"/>
            </i>
        </h5>
    </xsl:template>

</xsl:stylesheet>

次の出力を生成します(きれいに印刷した後):

<?xml version="1.0" encoding="utf-8"?>
<root>
    <html>
        <body>
            <h2>
                Party member:  O'Brien
            </h2>
            <h3>Works in:</h3>
            <div class="ministry">
                <h4>Ministry of truth</h4> -        Minitrue<h5>
                    Ministry of truth<i>concerns</i> itself with <i>News, entertainment,education and arts </i>
                </h5>
            </div>
        </body>
    </html>
    <html>
        <body>
            <h2>
                Party member: Julia
            </h2>
            <h3>Works in:</h3>
            <div class="ministry">
                <h4>Ministry of Peace</h4> -        Minipax<h5>
                    Ministry of Peace<i>concerns</i> itself with <i>War</i>
                </h5><h4>Ministry of Love</h4> -        Minilove<h5>
                    Ministry of Love<i>concerns</i> itself with <i>Dissidents</i>
                </h5>
            </div>
        </body>
    </html>
    <html>
        <body>
            <h2>
                Party member: Winston Smith
            </h2>
            <h3>Works in:</h3>
            <div class="ministry">
                <h4>Ministry of truth</h4> -        Minitrue<h5>
                    Ministry of truth<i>concerns</i> itself with <i>News, entertainment,education and arts </i>
                </h5>
            </div>
        </body>
    </html>
</root>
于 2012-10-25T12:17:11.880 に答える
1

XSLTを使用して必要な変換を作成するのは簡単なはずですが、このような大きなXMLを一度に処理するのは適切なテクノロジーではないと思います。データ全体をメモリにロードしてそこから機能します。そのようなビッグデータセット。

各HTMLドキュメントがドキュメント全体の小さな連続セクションに対応している場合は、プログラムを使用して(ドキュメント全体をメモリにロードしないXMLパーサーを使用して)大きなXMLファイルを分割し、次を使用して各部分を変換することをお勧めします。 XSLT。

各HTMLドキュメントに、ファイルや集計のさまざまな部分からのデータが含まれている場合(たとえば、いくつかの基準に一致するメンバーの総数)、XMLを解析してそのデータをSQLデータベースにロードしてから、HTMLを生成することをお勧めします。このデータベースから読み取るファイル。

于 2012-10-25T12:04:13.900 に答える
1

「巨大」の大きさはどれくらいですか?メンバーが100万人いる場合、SaxonのTinyTreeのサイズは約100Mbになると思いますが、これは確かにメモリ内で実行可能です。ただし、メインメモリの変換が不可能なポイントに危険なほど近づいている可能性があるため、ストリーミング変換を検討する必要があります。

幸い、これによってXSLTの使用が不可能になることはありませんが、可能なXSLTプロセッサの範囲は制限されます。

Saxon-EEは、ドラフトXSLT 3.0仕様に基づくストリーミング変換をサポートしていますが、コードをわずかに異なる方法で記述しなければならないことがよくあります。この例では、ストリーミングを使用するには、最初に「省庁」データを別のファイルに分割する必要があります。分割は、2つの結果ドキュメントを使用したスト​​リーミング変換として実行できます。次に、メインの変換で、Carles Salaによって提案されたキーを使用して、「メンバー」データのストリーム処理と、「省庁」データのメモリ内処理を実行できます。

ストリーミングXSLTは最先端のテクノロジーであるため、試してみることにしたユーザーを常に喜んで支援します。

于 2012-10-25T15:20:24.667 に答える