XSLT: position () и last () не возвращают ожидаемый результат - PullRequest
0 голосов
/ 11 февраля 2019

Я хотел бы получить позицию каждого svg:use[@href='#electron'], когда он совпадает.Я ожидаю занять позицию среди других элементов того же матча, но вместо этого я получаю цифры, которые я не понимаю.Как мне использовать position() и last(), чтобы получить ожидаемые цифры?

<!-- Add node "animateTransform" -->
<xsl:template match="svg:use[@href='#electron']">
    <!-- Copy the element -->
    <xsl:copy>
        <!-- And everything inside it -->
        <xsl:apply-templates select="@* | node()"/>
        <xsl:if test="position() = last()">
            <xsl:attribute name="class">val</xsl:attribute>
        </xsl:if>
        <animateTransform attributeName="transform" type="rotate" from="360 0 0" to="0 0 0" dur="20s" repeatCount="indefinite" />
        <xsl:value-of select="position()"/>/<xsl:value-of select="last()"/>
    </xsl:copy>
</xsl:template>

1 Ответ

0 голосов
/ 11 февраля 2019

Функции position() и last() возвращают положение относительно текущего набора узлов.

Однако набор узлов не определяется атрибутом match;это всего лишь фильтр, который определяет, какой шаблон должен быть применен.

Проблема заключается в части, которая выбирает узлы для применения шаблонов, например, apply-templates, который заканчивается совпадением svg:use.

Попробуйте использовать это в этом месте:

<xsl:apply-templates select="svg:use[@href='#electron']"/>

Затем вы получите ожидаемую позицию.

В качестве альтернативы вы можете изменить свой чек на последний элемент,например, вот так:

<xsl:if test="not(following-sibling::svg:use[@href='#electron'])">
    <xsl:attribute name="class">val</xsl:attribute>
</xsl:if>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...