我正在处理以非结构化方式保存表格数据的源HTML文件。基本上它是一堆绝对定位的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
和{ {1}}属性用于标识开始新节的元素。
相应的XSLT片段如下所示:
group-starting-with
问题是我无法弄清楚识别部分开始的工作模式。我能做的最好的事情是确保<xsl:for-each-group select="$lines/line" group-starting-with="...pattern here...">
<section>
<xsl:copy-of select="current-group()"/>
</section>
</xsl:for-each-group>
在XPath求值程序中单独使用时有效。但是,我似乎无法派生出与//line/item[1]/text()[matches(., '^[A-Z]$')]
一起使用的工作版本。
更新因此,想要的结果应如下所示:
group-starting-with
答案 0 :(得分: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
应该是模式而不是条件。