Как сделать так, чтобы атрибут раздела диапазона "указал c -использовать" значение - XSLT - PullRequest
1 голос
/ 05 мая 2020

Я пытаюсь указать атрибут раздела диапазона номеров specific-use в одном элементе para. Я получаю одно значение <span style="case"> с group-by и получаю значение group-by="ancestor::sec[1]". Возможно ли сделать диапазон, когда приходит <span style="case"> значение продолжить descendant:: или following-sibling::, тогда мы можем получить последнее specific-use значение. Входные 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>

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-вывод на выходе https://xsltfiddle.liberty-development.net/3NSTbfj/7 Мой ожидаемый результат

<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>

Например:

super 2–4, 5, 9

активный 5–8, 10

2–4: Создать диапазон, потому что <span style="case">super</span> поиск продолжился с тем же значением child:: или following-sibling::. 5–8: Создать диапазон, потому что <span style="case">active</span> поиск продолжился с тем же значением child:: или following-sibling::.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...