XSLT 2.0 / XPATH - выбрать при тестировании узла - PullRequest
0 голосов
/ 19 октября 2018

В XPATH под XSLT 2.0 мне неясно, почему не работает xsl:choose/xsl:when @test.

Когда я запускаю этот шаблон тестирования для элемента tei:del[@rend='expunctus'], тест НЕ возвращает результат:

<xsl:template match="tei:del[@rend='expunctus'] | 
    tei:gap | 
    tei:sic | 
    tei:supplied[@reason='added'] | 
    tei:surplus[@reason='repeated' or @reason='surplus']  |
    tei:unclear">
    <xsl:choose>
        <xsl:when test="tei:del[@rend='expunctus']">
            [<xsl:text>EXPUNCTUS</xsl:text>]
        </xsl:when>
</xsl:template>

Когда я запускаю этот шаблон только с атрибутом @rend='expunctus' в качестве теста, тест возвращает результат:

<xsl:template match="tei:del[@rend='expunctus'] | 
    tei:gap | 
    tei:sic | 
    tei:supplied[@reason='added'] | 
    tei:surplus[@reason='repeated' or @reason='surplus']  |
    tei:unclear">
    <xsl:choose>
        <xsl:when test="@rend='expunctus'">
            [<xsl:text>EXPUNCTUS</xsl:text>]
        </xsl:when>
</xsl:template>

Это из-за текущего узла ужеselected?

Я предпочитаю проверять элемент, а не только атрибут, чтобы устранить возможную неоднозначность.

Спасибо.

1 Ответ

0 голосов
/ 19 октября 2018

Да, это из-за текущего выбранного узла.

Ваш шаблон соответствует tei:del[@rend='expunctus'] (среди прочего), поэтому, когда вы делаете <xsl:when test="tei:del[@rend='expunctus']">, это относительно узла, который вы выбрали, поэтомуон ищет другой tei:del в качестве дочернего узла текущего узла.

Что вам, вероятно, нужно сделать, это ...

<xsl:when test="self::tei:del[@rend='expunctus']">

В качестве альтернативы рассмотрите возможность использования отдельных шаблонов длякаждый возможный узел и помещение любого общего кода в именованный шаблон.

...