表形式のデータを構造化されていない方法で保持するソース 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-group
withgroup-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>