XSLT:position()和last()未返回预期结果

时间:2019-02-11 01:43:41

标签: xslt

我想获取每个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 :(得分:1)

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>