0

我正在处理一个以非结构化方式保存表格数据的源 HTML 文件。基本上它是一堆绝对定位div的s。我的目标是重建某种结构化的 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 回答