如何使范围节属性“0”;“特定用途”;值-XSLT

如何使范围节属性“0”;“特定用途”;值-XSLT,xslt,xslt-2.0,xslt-3.0,Xslt,Xslt 2.0,Xslt 3.0,我试图在单个para元素中对范围节属性的特定用法进行编号。我使用分组依据获取单个值,并获取值分组依据=“祖先::秒[1]”。当出现值时,是否可以使范围继续后代::或以下兄弟::那么我们可以获取最后一个特定用途的值。 输入XML <book> <sec disp-level="1" specific-use="1"> <p>aaaaaa</p> <sec disp-level="2" specific-use="2">

我试图在单个para元素中对范围节属性
的特定用法进行编号。我使用
分组依据
获取单个值
,并获取值
分组依据=“祖先::秒[1]”
。当出现
值时,是否可以使范围继续
后代::
以下兄弟::
那么我们可以获取最后一个
特定用途的值。
输入XML

<book>
<sec disp-level="1" specific-use="1">
    <p>aaaaaa</p>
    <sec disp-level="2" specific-use="2">
        <p><span style="case">super</span></p>
    </sec>
    <sec disp-level="2" specific-use="3">
        <blockquote>
        <p><span style="case">super</span></p>
        </blockquote>
    </sec>
    <sec disp-level="2" specific-use="4">
            <p><span style="case">super</span></p>
    </sec>
</sec>
<sec disp-level="1" specific-use="5">
    <p><span style="case">super</span>, <span style="case">active</span></p>
    <sec disp-level="2" specific-use="6">
        <p><span style="case">active</span></p>
    </sec>
</sec>
<sec disp-level="1" specific-use="7">
    <p><span style="case">active</span></p>
    <sec disp-level="2" specific-use="8">
        <p><span style="case">active</span></p>
    </sec>
    <sec disp-level="2" specific-use="9">
        <p><span style="case">super</span></p>
    </sec>
    <sec disp-level="2" specific-use="10">
        <p><span style="case">active</span></p>
    </sec>
</sec>

AAAAA

超级

超级

超级

超级活跃

活跃的

活跃的

活跃的

超级

活跃的

XSLT代码

      <xsl:template match="book">
    <xsl:copy>
        <xsl:for-each-group select="//*" group-by="span[@style='case']">
            <xsl:text>&#x0A;</xsl:text>
            <p>
                <case><xsl:value-of select="current-grouping-key()"/></case><xsl:text> </xsl:text>
            <sec>
              <xsl:for-each select="current-group()">
                <number>
                    <xsl:value-of select="ancestor::sec[1]/@specific-use"/>
                </number>
                  <xsl:if test="position()!=last()">
                      <xsl:text>, </xsl:text>
                  </xsl:if>
              </xsl:for-each>
            </sec>
            </p>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>


;

, 

我的XSLT给定输出
我的预期产出

<book>
<p><case>super</case> <sec><number>2</number>&#x2013;<number>4</number>, <number>5</number>, <number>9</number></sec></p>
<p><case>active</case> <sec><number>5</number>&#x2013;<number>8</number>, <number>10</number></sec></p>
</book>

超级2–;4,5,9

主动5–;8,10

例如:

超级2–4、5、9

活动5–8、10


2-4
:创建范围,因为
super
搜索继续相同的值
子项:
以下同级项::


5–8
:创建范围,因为
活动的
搜索继续相同的值
子项:
以下兄弟项::

我不太明白嵌套分组在做什么,给你一个识别整数序列中的范围的示例,看看哪个只使用
组相邻=“.-position()”
@MartinHonnen先生,谢谢您的回复,但是
5
s/b没有到达范围,因为
super
disp level=“1”
而不是
super
前面的兄弟::
sec
disp level=“1”
如果
super
第[1]秒到达,那么我的预期范围
1-5
。是的,我知道我链接到的示例不会创建您想要的输出,它会处理您链接到的示例的结果,因此您可以调整分组代码,使其仅对稍后要检查的元素进行包装/分组,并将其连接为一个范围。很抱歉,与您之前的示例一样,我未能从您的描述和代码片段中理解您想要实现的确切标准。先生,我只想在这个元素值当前位置
super
与continue
substant::
后续同级::
秒时创建范围,那么我们可以创建范围吗?@MartinHonnen先生,是否可以使用XSLT 3.0?我不太明白嵌套分组在做什么,为了给您一个在整数序列中识别范围的示例,请参见哪个仅使用
组相邻=“.-position()”
@MartinHonnen先生,感谢您的回复,但是
5
s/b未出现范围,因为
super
是come
disp level=“1”
而非
super
前面的兄弟姐妹:
sec
disp level=“1”
如果
super
来了sec[1],那么我的预期范围
1–5
。是的,我知道我链接到的样本不会创建您想要的输出,它会处理您链接到的样本的结果,因此,也许您可以调整分组代码,使其仅对稍后要检查的元素进行包装/分组,并将其连接为一个范围。很抱歉,与您之前的示例一样,我未能从您的描述和代码片段中理解您想要实现的确切标准。先生,我只想在该元素值当前位置
super
与continue
substant::
后续同级::
秒相同的搜索时创建范围,那么我们可以创建范围吗?@MartinHonnen先生,是否可以使用XSLT 3.0?