Проверить первый подузел из узла - PullRequest
2 голосов
/ 23 апреля 2010

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>   

Как проверить сначала <submode> от каждого <mode> (мне нужны номера: 1, 7, 14 ) в такой конструкции:

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

Я не понимаю, как использовать position () здесь.

Ответы [ 3 ]

5 голосов
/ 23 апреля 2010

Обычно не верно , что

position() = 1

оценивается как true(), если текущий узел имеет родительский режим, а текущий узел является первымsubmode дочерний элемент его родителя.

position() указывает позицию текущего списка узлов , и это определяется по-разному, в зависимости от того, как атрибут select<xsl:apply-templates> указано.

Например (при условии, что предоставленный XML имеет верхний элемент, который является родительским элементом для элементов mode), если шаблон был выбран при обработке следующим образом:

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

затем

position() = 1

верно только для 3-го submode дочернего элемента первого mode элемента.

Один правильный ответ:

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

Или, рекомендуется :

Есть отдельный шаблон:

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

В этом случае не требуется код в шаблоне, чтобы проверить, является ли текущий узел первым submode дочерним - это уже известно bвот так.

1 голос
/ 24 апреля 2010

Для подсчета количества submode с в предыдущем mode тогда и только тогда, когда это первый submode текущего mode, и во избежание дублирования кода между <xsl:template match="submode"> и <xsl:template match="submode[1]">:

<!-- Special processing for first submode -->
<xsl:template match="submode[1]">
    <xsl:variable name="previousSubmodes" 
                  select="count(../preceding-sibling::mode/submode)"/>

    <!-- ... Do stuff with count ... -->

    <!-- Perform regular submode processing -->
    <xsl:call-template name="submode"/>

</xsl:template>

<!-- Regular processing for submodes -->
<xsl:template match="submode" name="submode">
    <!--  ... Do whatever ... -->
</xsl:template>

В качестве альтернативы вы можете вместо этого выполнить обработку подсчета из шаблона для mode. Таким образом, вам не понадобится никакой специальной обработки для первого submode.

<xsl:template match="mode">
    <!-- ... Other processing ... -->

    <xsl:variable name="previousSubmodes" 
                  select="count(preceding-sibling::mode/submode)"/>

    <!-- ... Do stuff with count ... -->

    <!-- Handle submodes; could use select="node()|@*" instead to process 
         everything, not just submodes  -->
    <xsl:apply-templates select="submode"/>

</xsl:template>

<xsl:template match="submode">
    <!--  ... Do whatever ... -->
</xsl:template>
0 голосов
/ 23 апреля 2010

Ваш <xsl:template match= должен читать "mode/submode[1]".

Тогда у вас будет первое submode каждого mode.

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