XSLT / Xpath: Как узнать, что что-то есть или нет в ключе (с помощью if)? - PullRequest
0 голосов
/ 26 апреля 2019

У меня проблема с моим кодом в XSLT с if.Я использую функцию ключа, и там я узнаю, есть ли что-то в ключе или нет.

    <xsl:key name="hlp" match="help" use="@id" />
    ...
    <xsl:if test="key('hlp', @some_id) !=''">
    ...
    </xsl:if>

Это верно, это дает мне то, что я хочу, но как я могу сделать противоположное условие, что @some_id не являетсяв ключе hlp ... Я имею в виду:

    <xsl:if test="key('hlp', @some_id) <!--is equal--> ''">
    ...
    </xsl:if>

Есть ли что-то подобное в XSLT / XPath?

Ответы [ 2 ]

1 голос
/ 26 апреля 2019

Когда вы вызываете key('x', 'y'), результатом является набор узлов, в которых ключ равен 'y'. Вы можете проверить, является ли набор узлов пустым, используя функцию empty () (в XSLT 2.0) или функцию not () в XSLT 1.0:

<xsl:if test="not(key('x', 'y'))" version="1.0">...</xsl:if>
<xsl:if test="empty(key('x', 'y'))" version="2.0">...</xsl:if>

или для обратного теста (для проверки, если что-то было найдено):

<xsl:if test="key('x', 'y')" version="1.0">...</xsl:if>
<xsl:if test="exists(key('x', 'y'))" version="2.0">...</xsl:if>

Тестирование путем сравнения результата со строкой неверно. Оба теста key('x','y')='' и key('x','y')!='' будут возвращать false, если результатом функции key() является пустой набор узлов; и наоборот, если функция key() выбирает два узла, один с содержимым, а другой без, тогда оба теста вернут true.

0 голосов
/ 12 июня 2019
<xsl:key name="hlp" match="help" use="@id" />
...
<xsl:if test="key('hlp', @some_id) !=''">
...
</xsl:if>

Как уже указывалось Майклом Кеем, избегайте использования оператора !=, если только вы действительно не знаете, что он делает.

Это в стороне (и тот факт, что key()функция возвращает набор узлов), это больше в духе XSLT написать выше:

<xsl:apply-templates select="key('hlp', @some_id)"/>

, но как я могу сделать обратное условие, что @some_id не находится в ключе hlp... я имею в виду:

    <xsl:if test="key('hlp', @some_id) <!--is equal--> ''">
    ...
    </xsl:if> ```

Is there something like that in XSLT/XPath?

Опять же, в духе XSLT, я рекомендую использовать код, подобный следующему:

<xsl:apply-templates select="/*[not(key('hlp', @some_id))]" mode="not-found"/>

В приведенном выше выражении select можнозамените /* любым существующим узлом в документе - если это действительно имеет значение.

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