我有一些XML文件(实际上的XVD),其中载有我想要自动编号的多层次条款;问题是,这些文件是无结构的、与案文属性所示的等级相同的清单。 是的,我知道,但我可以现实地改变它们;太多而且太大。
显示我所希望的结构和标签的简化案例是:
<root>
<p label="1" class="clause_L1">A</p>
<p label="1.1" class="clause_L2">B</p>
<p label="1.2" class="clause_L2">C</p>
<p label="1.3" class="clause_L2">D</p>
<p label="2" class="clause_L1">E</p>
<p label="3" class="clause_L1">F</p>
<p label="4" class="clause_L1">G</p>
<p label="4.1" class="clause_L2">H</p>
<p label="4.1.1" class="clause_L3">I</p>
<p label="4.1.2" class="clause_L3">J</p>
<p label="4.2" class="clause_L2">K</p>
<p label="4.3" class="clause_L2">L</p>
</root>
在经过大量 ha后,我举出以下风格:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>
<xsl:output method="xml" indent="yes" />
<xsl:template match="/">
<xsl:apply-templates />
</xsl:template>
<xsl:template match="p[substring(@class, 1, 6) = clause ]">
<xsl:variable name="class" select="@class"/>
<xsl:variable name="level" select="substring(@class, 9, 1)"/>
<xsl:variable name="parent" select="preceding-sibling::p[@class = concat( clause_L , $level - 1)][1]"/>
<xsl:variable name="parentPos" select="count($parent/preceding-sibling::p[substring(@class, 1, 6) = clause ]) + 1"/>
<clause>
<xsl:attribute name="parent">
<xsl:value-of select="$parent/@label"/>
</xsl:attribute>
<xsl:attribute name="parentPos">
<xsl:value-of select="$parentPos"/>
</xsl:attribute>
<xsl:attribute name="origLabel">
<xsl:value-of select="@label"/>
</xsl:attribute>
<xsl:attribute name="label">
<xsl:number count="p[string($parent) = or position() > $parentPos][@class = $class]" />
</xsl:attribute>
<xsl:value-of select="."/>
</clause>
</xsl:template>
......这给我提供了目前最低水平的正确数字:
<clause parent="" parentPos="1" origLabel="1" label="1">A</clause>
<clause parent="1" parentPos="1" origLabel="1.1" label="1">B</clause>
<clause parent="1" parentPos="1" origLabel="1.2" label="2">C</clause>
<clause parent="1" parentPos="1" origLabel="1.3" label="3">D</clause>
<clause parent="" parentPos="1" origLabel="2" label="2">E</clause>
<clause parent="" parentPos="1" origLabel="3" label="3">F</clause>
<clause parent="" parentPos="1" origLabel="4" label="4">G</clause>
<clause parent="4" parentPos="7" origLabel="4.1" label="1">H</clause>
<clause parent="4.1" parentPos="8" origLabel="4.1.1" label="1">I</clause>
<clause parent="4.1" parentPos="8" origLabel="4.1.2" label="2">J</clause>
<clause parent="4" parentPos="7" origLabel="4.2" label="2">K</clause>
<clause parent="4" parentPos="7" origLabel="4.3" label="3">L</clause>
首先,在这一模板中可以产生较高的贴标签数量,因为标识似乎为xsl:编号只是目前情况下的工作——因此,我不知道如何使目前的下一个水平出现反响。
第二,有更好的办法完全停止这种做法? 我铭记着源数据格式。