Xml XSLT-分析以下连续节点

Xml XSLT-分析以下连续节点,xml,xslt,xslt-2.0,Xml,Xslt,Xslt 2.0,我有一个这样的xml <doc> <para>texttext<page>1</page>texttext<page>1</page>texttext</para> <para>texttext<page>1</page><page>2</page>texttext</para> <para>texttex

我有一个这样的xml

<doc>
    <para>texttext<page>1</page>texttext<page>1</page>texttext</para>
    <para>texttext<page>1</page><page>2</page>texttext</para>
    <para>texttext<page>1</page><page>2</page><page>3</page>texttext<page>4</page><page>5</page><page>6</page>texttext</para>
    <para>texttext<page>1</page><page>2</page><page>3</page><page>4</page>texttext</para>
</doc>
<doc>
    <para>texttext<link>1</link>texttext<link>1</link>texttext</para>
    <para>texttext<link>1</link>,<link>2</link>texttext</para>
    <para>texttext<link>1</link>-<link>3</link>texttext<link>4</link>-<link>6</link>texttext</para>
    <para>texttext<link>1</link>-<link>4</link>texttext</para>
</doc>

text文本1文本1文本文本
text文本12文本文本
text文本123text文本456text文本
文本1234textText
我需要使用xsl转换将
节点转换为
,需要考虑以下规则:

  • 如果只出现一个
    节点(不跟随任何页面节点),它只会转换为
  • 如果连续放置两个
    节点(上例中的场景2),则必须在输出
    节点之间添加“.”
  • 如果连续放置了3个或更多的
    节点(上面示例中的场景3和场景4),只需添加页面节点的第一个和最后一个内容,并用“-”分隔
所以,输出应该是这样的

<doc>
    <para>texttext<page>1</page>texttext<page>1</page>texttext</para>
    <para>texttext<page>1</page><page>2</page>texttext</para>
    <para>texttext<page>1</page><page>2</page><page>3</page>texttext<page>4</page><page>5</page><page>6</page>texttext</para>
    <para>texttext<page>1</page><page>2</page><page>3</page><page>4</page>texttext</para>
</doc>
<doc>
    <para>texttext<link>1</link>texttext<link>1</link>texttext</para>
    <para>texttext<link>1</link>,<link>2</link>texttext</para>
    <para>texttext<link>1</link>-<link>3</link>texttext<link>4</link>-<link>6</link>texttext</para>
    <para>texttext<link>1</link>-<link>4</link>texttext</para>
</doc>

text文本1文本1文本文本
text1,2texttext
text 1-3text 4-6text
text1-4texttext
我为完成此任务编写了以下xsl

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

    <xsl:template match="page">
        <link>
            <xsl:apply-templates/>
        </link>
    </xsl:template>

    <xsl:template match="page[following-sibling::node()[1][self::page]]">
        <link>
            <xsl:apply-templates/>
        </link>
        <xsl:text>,</xsl:text>
        <link>
            <xsl:apply-templates select="following-sibling::*[1]"/>
        </link>
    </xsl:template>

    <xsl:template match="page[following-sibling::node()[1][self::page]][following-sibling::node()[2][self::page]]">
        <link>
            <xsl:apply-templates/>
        </link>
        <xsl:text>-</xsl:text>
        <link>
            <xsl:apply-templates select="following-sibling::*[2]"/>
        </link>
    </xsl:template>

,
-
但是这种方法不起作用,因为它添加了“当出现3个连续的
节点时,如果有更多的
节点连续出现,这种方法是无效的

有谁能推荐一种xslt中的好方法来分析xslt中的以下同级表单并完成此任务吗

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:output method="xml" encoding="UTF-8" indent="yes" />

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

    <xsl:template match="page[not(preceding-sibling::node()[1][self::page])]">
        <xsl:variable name="pages" select="following-sibling::page[
            preceding-sibling::node()[1][self::page]
            and generate-id(current()) = generate-id(preceding-sibling::page[
                not(preceding-sibling::node()[1][self::page])
            ][1])
        ]" />
        <xsl:apply-templates select="." mode="link" />
        <xsl:if test="count($pages) = 1">,</xsl:if>
        <xsl:if test="count($pages) &gt; 1">-</xsl:if>
        <xsl:apply-templates select="$pages[last()]" mode="link" />
    </xsl:template>
    <xsl:template match="page" />

    <xsl:template match="page" mode="link">
        <link>
            <xsl:apply-templates select="@*|node()"/>
        </link>
    </xsl:template>
</xsl:transform>
following-sibling::page[
    preceding-sibling::node()[1][self::page]
    and generate-id(current()) = generate-id(preceding-sibling::page[
        not(preceding-sibling::node()[1][self::page])
    ][1])
]