Xml XSLT-<;xsl:number>;元素跳过某些节点

Xml XSLT-<;xsl:number>;元素跳过某些节点,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,我有一个xsl,如下所示 <doc> <sec> <para>para</para> <para>para</para> <para>§ 9.02A spara</para> <para>para</para> <para>para</para> </s

我有一个xsl,如下所示

<doc>
    <sec>
        <para>para</para>
        <para>para</para>
        <para>§ 9.02A spara</para>
        <para>para</para>
        <para>para</para>
    </sec>
    <sec>
        <para>para</para>
        <para>para</para>
        <para>para</para>
        <para>para</para>
        <para>para</para>
    </sec>
    <sec>
        <para>para</para>
        <para>para</para>
        <para>para</para>
        <para>para</para>
        <para>para</para>
    </sec>
</doc>
我已经编写了xsl来实现这一点,如下所示:

<xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="para">
        <xsl:variable name="position" as="xs:string">
            <xsl:number count="para" level="single" select=". except para[matches(.,'§\s\d+\.\d+[A-Z]')]"/>
        </xsl:variable>

        <para>
            <xsl:if test="matches(.,'§\s\d+\.\d+[A-Z]')">
                <xsl:attribute name="type">
                    <xsl:value-of select="'XXX'"/>
                </xsl:attribute>
                <xsl:apply-templates/>
            </xsl:if>
            <xsl:if test="not(matches(.,'§\s\d+\.\d+[A-Z]'))">
                <xsl:attribute name="type">
                    <xsl:value-of select="$position"/>
                </xsl:attribute>
                <xsl:apply-templates/>
            </xsl:if>

        </para>
    </xsl:template>
这可以通过使用其他方法来完成,比如count()函数,但我确实需要这样做。有人能给我建议一种方法吗?我如何进行修改以获得正确的输出?

更改

<xsl:number count="para" level="single" select=". except para[matches(.,'§\s\d+\.\d+[A-Z]')]"/>


不需要
self:para
,我认为,
也应该这样做。
<doc>
    <sec>
        <para type="1">para</para>
        <para type="2">para</para>
        <para type="XXX">§ 9.02A spara</para>
        <para type="4">para</para>
        <para type="5">para</para>
    </sec>
    <sec>
        <para type="1">para</para>
        <para type="2">para</para>
        <para type="3">para</para>
        <para type="4">para</para>
        <para type="5">para</para>
    </sec>
    <sec>
        <para type="1">para</para>
        <para type="2">para</para>
        <para type="3">para</para>
        <para type="4">para</para>
        <para type="5">para</para>
    </sec>
</doc>
<xsl:number count="para" level="single" select=". except para[matches(.,'§\s\d+\.\d+[A-Z]')]"/>
<xsl:number count="para[not(matches(.,'§\s\d+\.\d+[A-Z]+'))]" level="single"/>