0

表形式のデータを構造化されていない方法で保持するソース HTML ファイルを処理しています。基本的に、これは絶対配置された s の集まりですdiv。私の目標は、ある種の構造化された XML データを再構築することです。これまでのところ、XSLT 2.0 を使用して、次のような XML を生成できました。

<data>
    <line top="44">
         <item left="294">Some heading text</item>
    </line>
    <line top="47">
         <item left="718">A</item> <!-- this item is a section-start -->
         <item left="764">Section heading</item>
    </line>
    <line top="78">
        <item left="92">Data</item>
        <item left="144">Data</item>
        <item left="540">Data</item>
        <item left="588">Data</item>
    </line>
    <line top="101">
        <item left="61">B</item> <!-- this item is a section-start -->
        <item left="144">Section heading</item>
    </line>
    <line top="123">
        <item left="92">Data</item>
        <item left="144">Data</item>
    </line>
</data>

ただし、次に行う必要があるのは、行をセクションにグループ化することです。各セクションは、最初の項目の値が単一の文字 A – Z で構成される行で始まります。私のアプローチは、すべての<line>要素を$lines変数に保持し、 xsl:for-each-groupwithgroup-starting-with属性を使用して、新しいセクションを開始する要素を識別することです。

それぞれの XSLT フラグメントは次のようになります。

<xsl:for-each-group select="$lines/line" group-starting-with="...pattern here...">
    <section>
        <xsl:copy-of select="current-group()"/>
    </section>
</xsl:for-each-group>

問題は、セクションの開始を識別するための作業パターンを理解できないことです。私ができる最善のことは//line/item[1]/text()[matches(., '^[A-Z]$')]、XPath エバリュエーターで個別に使用した場合に機能することを確認することでした。ただし、で使用する作業バージョンを派生させることはできないようですgroup-starting-with

更新したがって、必要な結果は次のようになります。

<data>
    <section> <!-- this section started automatically because of being at the beginning -->
        <line top="44">
             <item left="294">Some heading text</item>
        </line>
    </section>
    <section>
        <line top="47">
             <item left="718">A</item> <!-- this item is a section-start -->
             <item left="764">Section heading</item>
        </line>
        <line top="78">
            <item left="92">Data</item>
            <item left="144">Data</item>
            <item left="540">Data</item>
            <item left="588">Data</item>
        </line>
    </section>
    <section>
        <line top="101">
            <item left="61">B</item> <!-- this item is a section-start -->
            <item left="144">Section heading</item>
        </line>
        <line top="123">
            <item left="92">Data</item>
            <item left="144">Data</item>
        </line>
    </section>
</data>
4

1 に答える 1

3

ソリューション:

<xsl:for-each-group select="$lines/line" group-starting-with="line[matches(child::item[1], '^[A-Z]$')]">
    <section name="{current-group()[1]/item[1]}">
        <xsl:copy-of select="current-group()"/>
    </section>
</xsl:for-each-group>

秘訣は、それが条件ではなくパターンgroup-starting-withであることを本当に理解することです。

于 2012-07-28T09:26:24.437 に答える