从节点测试第一个子节点

Kal*_*nin 2 xslt xpath

XML:

    <mode>
        <submode>1</submode>
        <submode>2</submode>
        <submode>3</submode>
        <submode>4</submode>
        <submode>5</submode>
        <submode>6</submode>
        <submode>7</submode>
    </mode>
    <mode>
        <submode>7</submode>
        <submode>8</submode>
        <submode>9</submode>
        <submode>10</submode>
        <submode>11</submode>
        <submode>12</submode>
        <submode>13</submode>
    </mode>
    <mode>
        <submode>14</submode>
        <submode>15</submode>
        <submode>16</submode>
        <submode>17</submode>
        <submode>18</submode>
        <submode>19</submode>
        20</submode>
    </mode>   
Run Code Online (Sandbox Code Playgroud)

如何在这种结构中首先测试<submode>每个<mode>(我需要得到数字:1,7,14):

<xsl:template match="submode">
    <xsl:if test="(parent::mode) and (...what?...)">
        ...
    </xsl:if>
    ...
</xsl:template>
Run Code Online (Sandbox Code Playgroud)

我不明白如何在这里使用position().

Dim*_*hev 5

它通常不是真的

position() = 1

计算true()当前节点是否具有父模式,并且当前节点是其父节点的第一submode个子节点.

position()指定当前节点列表的位置,这是以不同的方式定义的,具体取决于指定select属性的<xsl:apply-templates>方式.

例如(假设提供的XML具有作为元素的父元素的top mode元素),如果在处理以下内容时选择了模板:

<xsl:apply-templates select="/*/mode/submode[. = 3]"/>

然后

position() = 1

仅适用于第submode一个mode元素的第3 个子元素.

一个正确的答案:

parent::mode and not(preceding-sibling::submode)

或者,推荐:

有一个单独的模板:

<xsl:template match="mode/submode[1]">

在这种情况下,模板中的代码不需要检查当前节点是否是第一submode个子节点- 这已经知道了.