создание - Как указать «не равно» при сравнении строк в XSLT<xsl:if>?




шаблонов задачи (3)

Если вы хотите сравнить с строковым литералом, вам нужно поместить его в (одиночные) кавычки:

<xsl:if test="Count != 'N/A'">

В настоящее время у меня есть xsl со следующим кодом, где я пытаюсь распечатать «count», только если он не равен N/A но похоже, что "!=" не работает.

<xsl:for-each select="Directory/Match">
    <xsl:if test = "Count != N/A">
        <tr>
            <td><xsl:value-of select="@bookName" /></td>
            <td><xsl:value-of select="@AuthorName" /></td>
            <td><xsl:value-of select="Count" /></td>
        </tr>
    </xsl:if>
</xsl:for-each>

Однако он работает, если я попытаюсь сравнить его с числовым значением.

Пример:

<xsl:if test = "Occurrances != 0">

Может кто-нибудь, пожалуйста, скажите мне: если я хотел бы сравнить строки, что я могу использовать?


Как говорит Филбурт; но также обратите внимание, что обычно лучше писать

test="not(Count = 'N/A')"

Если есть только один элемент графа, они означают одно и то же, но если нет графа, или если их несколько, тогда значения разные.

6 ЛЕТ ПОЗЖЕ

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

Оператор «=» и «! =» В XPath может сравнивать два набора значений. В общем случае, если A и B являются наборами значений, то «=» возвращает значение true, если существует какая-либо пара значений из A и B, которые равны, а «! =» Возвращает true, если существует какая-либо пара, которая неравнозначна.

В общем случае, когда A выбирает узлы «нуль-один», а B является константой (скажем, «NA»), это означает, что not(A = "NA") возвращает true, если A либо отсутствует, либо имеет значение не равным «NA». Напротив, A != "NA" возвращает true, если присутствует A, а не равно "NA". Обычно вы хотите, чтобы «отсутствующий» случай считался «не равным», что означает, что not(A = "NA") является соответствующей формулировкой.


Это простое преобразование дает желаемый результат :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output method="text"/>
 <xsl:strip-space elements="*"/>

    <xsl:template match="/">
    <xsl:apply-templates select="//text()"/>
    </xsl:template>

    <xsl:template match="text()">
      <xsl:copy-of select="."/>
      <xsl:if test="not(position()=last())">,</xsl:if>
    </xsl:template>
</xsl:stylesheet>

Обратите внимание на использование:

 <xsl:strip-space elements="*"/>

для удаления любых текстовых узлов только для пробелов.

Обновление : AJ поднял проблему, что результаты shoud будут сгруппированы в recirds / tuples в строке. В вопросе о том, какой должна быть запись / кортеж, точно не указано. Поэтому текущее решение решает две проблемы текстовых узлов только пробела и отсутствующих запятых, но не нацелено на то, чтобы вывести вывод в записи / кортежи.





xslt