0

XML ファイルの大規模なコレクションを調べて、CALS モデル テーブル (ほとんどのファイルに少なくとも 1 つ含まれています) を探し、表形式のデータをデータベースに保存するプロセスを構築しています。最初の例では、これらのテーブルの多くは異なる構造を持っていますが、データベースを使用して構造の共通性を分析したいと考えています。サンプル ファイルからの (不完全な) 抜粋を以下に示します。

   <table frame="none">
        <tgroup cols="6" colsep="0" rowsep="0">
            <colspec colname="1" colnum="1" colwidth="127pt" align="center"/>
            <colspec colname="2" colnum="2" colwidth="39pt" align="center"/>
            <colspec colname="3" colnum="3" colwidth="30pt" align="center"/>
            <colspec colname="4" colnum="4" colwidth="33pt" align="center"/>
            <colspec colname="5" colnum="5" colwidth="33pt" align="center"/>
            <colspec colname="6" colnum="6" colwidth="87pt"/>
            <thead>
                <row valign="bottom">
                    <entry align="center">Product</entry>
                    <entry>SKU</entry>
                    <entry>Length</entry>
                    <entry>Depth</entry>
                    <entry align="center">Weight</entry>
                    <entry align="center">Remarks</entry>
                </row>
                <row valign="bottom">
                    <entry></entry>
                    <entry></entry>
                    <entry>(m)</entry>
                    <entry>(m)</entry>
                    <entry align="center">(kg) </entry>
                    <entry align="center"> </entry>
                </row>
            </thead>
            <tbody>
                <row>
                    <entry align="left" namest="1" nameend="6"><hd4>Whites</hd4></entry>
                </row>
                <row>
                    <entry>Albion</entry>
                    <entry>12345</entry>
                    <entry>398</entry>
                    <entry>15.5</entry>
                    <entry> </entry>
                    <entry>N/A </entry>
                </row>
                <row>
                    <entry>Rotorua</entry>
                    <entry>12346</entry>
                    <entry>398</entry>
                    <entry>15.5</entry>
                    <entry> </entry>
                    <entry> </entry>
                </row>
                <row>
                    <entry>Quintep</entry>
                    <entry>12347</entry>
                    <entry>398</entry>
                    <entry>15.5</entry>
                    <entry> </entry>
                    <entry> </entry>
                </row>

プロセス中に遭遇することがわかっている異なる構造のため、次のプロパティを持つエンティティとして格納する以外に、このすべてのデータを保持するデータベースにテーブル スキーマを作成することはできません。

  • doc_id
  • table_id
  • 行 ID
  • col_id
  • col_name
  • col_units
  • エントリ値

これにより、文字列と数値の両方を文字列として保存できます。

場合によっては必要な追加のプロパティは、tbody/row[1] の上記の例のまたがる行で定義されている「カテゴリ」です。ここでは、元のドキュメントの作成者がストラドルを追加して、直後の行を分類しています。

<row>
    <entry align="left" namest="1" nameend="6"><hd4>Whites</hd4></entry>
</row>

これらのまたがる列は、私にいくつかの問題を引き起こしています。それらが発生する場所では、次のまたがりが発生するまで、次の行を「分類」します。

私の最初のドキュメント分析では、これらのストラドルに関連して、テーブル構造にいくつかの可能な「タイプ」があることが示されました。

  • タイプ 1. テーブルに跨りがないこと - シンプルで処理が容易
  • タイプ 2. tbody の最初の行がストラドルであり、tbody でこれより下にゼロ以上のストラドルがあること
  • 3 を入力します。テーブルにはまたがりが含まれていますが、tbody の最初の行には含まれていません。

タイプ 3 は、タイプ 1 (最初のまたがる行を除くすべての行) とタイプ 2 (最初のまたがる行からのすべての行) の 2 つの別個のテーブルとして扱われる可能性があります。

したがって、この処理の問題を解決する鍵は、最初のまたがりの位置を特定し、またがりの前のすべて (0 行以上) を Type1 として扱い、またがったそれ以降をすべて Type2 として扱うことであると思われます。

しかし、私は最初のまたがりの位置を特定するのに苦労しています。1st straddle の私の定義 (Xpath 用語で) は、次のとおりです。

tbody/row[entry [@nameend &gt; @namest]][1]

これにより、ストラドルが常に列 1 からキー入力されるとは限らず、常に最後の列に拡張されるとは限らない可能性が考慮されます。これらの可能性は両方とも、現実世界のデータに存在します。

したがって、私の問題は、最初のストラドルの位置を特定することに戻ります。

このページには多くの同様のソリューションがリストされています http://www.dpawson.co.uk/xsl/sect2/flatfile.html#d5010e13

しかし、それらを自分のインスタンスに適用するのに苦労しています。

このようなものがうまくいくかもしれません

<xsl:key name="straddles" match="row[entry[@nameend &gt; @namest]]" use="entry/@namest"/>

しかし、キーの @use 属性を定義するために何を使用すればよいかわかりません。

最初にまたがる変数を定義しようとすると、key() 関数に渡す定義値がありません。

<xsl:variable name="first-straddle" select="table/tgroup/tbody/row[generate-id() = generate-id(key('straddles',?????))]"/>

最初のまたがりの場所を見つけるにはどうすればよいですか?

前もって感謝します

追記事項: ![ブラウザにレンダリングされたサンプル テーブルのスクリーン ショット] https://dl.dropboxusercontent.com/u/5065004/Screen%20Shot%202014-02-25%20at%2013.54.08.png 上のスクリーンショットは、ブラウザでレンダリングされたテーブルの例。ストラドル行は、次の行までのデータを「分類」します。@nasmest および @nameend 属性は、次のまたがるまでの ROWS の数ではなく、見出しによってまたがる COLUMNS の数を定義します。後者の値は、マークアップでは IMPLICIT であり、私が探している XPath ステートメントです。前者 - 列のまたがり - は、マークアップで EXPLICIT です。

4

1 に答える 1

0

これを正しくたどると(大きなIF)、それぞれ<entry>が対応するカテゴリを見つけることができます:

<xsl:value-of select="parent::row/preceding-sibling::row[entry[@namest]][1]/entry/hd4"/>

[編集 ----------------------------------
明確にするために: これは、 のコンテキストから呼び出されますentry。これを次のように読みます。
1. 親に移動しrowます。2.属性を持つを持つ同じ親内の最も近いものを逆方向
に 探します。 3. 手順 2 で見つかった の要素の値を取得します。--------------------------------- ---------- ]rowtbodyentrynamest
hd4entryrow

しかし、それだけでは十分ではないようです。また<entry>、親行内の位置がnamestおよびnameend属性によって設定された範囲内にあるかどうかを確認する必要がありますか? それが正しければ、別の疑問が生じます: 2 つの共存する「またがり」を持つことは可能でしょうか? たとえば、1 列目から 3 列目までは 1 つのカテゴリで、5 列目から 6 列目までは別のカテゴリですか?


編集

次の例を調べてください。

<tbody>
    <row>
        <entry namest="1" nameend="3"><hd4>Colors</hd4></entry>
    </row>
    <row>
        <entry>Red</entry>
        <entry>Green</entry>
        <entry>Blue</entry>
    </row>
    <row>
        <entry>Black</entry>
        <entry>White</entry>
    </row>
    <row>
        <entry>Cyan</entry>
        <entry>Magenta</entry>
        <entry>Yellow</entry>
        <entry>Widget(not a color)</entry>
    </row>
    <row>
        <entry namest="4" nameend="5"><hd4>Shapes</hd4></entry>
    </row>
    <row>
        <entry>Brown</entry>
        <entry>Pink</entry>
        <entry>Golden</entry>
        <entry>Circle</entry>
    </row>
    <row>
        <entry>Azure</entry>
        <entry>Grey</entry>
        <entry>Orange</entry>
        <entry>Square</entry>
        <entry>Triangle</entry>
        <entry>Gadget(neither a color nor a shape)</entry>
    </row>
</tbody>

私の理解が正しければ、2 番目の「またがる」は最初の「またがる」に取って代わるのではなく、それに追加されます。したがって、次のコンテキストから上記の xPath を適用しようとすると、次のようになります。

<entry>Pink</entry>

列 #2 に適用される最初の前の「またがる」を探すべきだったのに、最初の前の「またがる」を探したため、間違った結果 (Shapes) が得られます。

于 2014-02-25T10:14:29.723 に答える