Несколько условий в одном XSLT когда оператор - PullRequest
0 голосов
/ 11 марта 2019

Когда я проверял код, я увидел несколько условий в одном операторе теста. Это не дало мне правильный результат.

<xsl:choose>
<xsl:when test="(ws:Additional_Information/ws:Company/@ws:PriorValue = 'A' or 'B' or 'C' or 'D' or 'E')and ws:Eligibility='false'">
<xsl:text>T</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="ws:Additional_Information/ws:Employee_Status"/>
</xsl:otherwise>
</xsl:choose>

Но когда я начал использовать, как показано ниже, я получил правильный ответ.

<xsl:choose>
<xsl:when test="(ws:Additional_Information/ws:Company/@ws:PriorValue = 'A' or ws:Additional_Information/ws:Company/@ws:PriorValue ='B' or ws:Additional_Information/ws:Company/@ws:PriorValue ='C' or ws:Additional_Information/ws:Company/@ws:PriorValue ='D' or ws:Additional_Information/ws:Company/@ws:PriorValue ='E')and ws:Eligibility='false'">
<xsl:text>T</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="ws:Additional_Information/ws:Employee_Status"/>
</xsl:otherwise>
</xsl:choose>

Почему первое неверно?

Ответы [ 2 ]

2 голосов
/ 11 марта 2019

Проблема с вашим первым выражением заключается в том, что or оператор является логическим оператором, а не составителем последовательности.Так что это выражение @ws:PriorValue = 'A' or 'B' не имеет смысла.

В XPath 1.0 одним из способов упрощения многократного сравнения в одном и том же наборе узлов является использование выражения точка ., например:

ws:Additional_Information
   /ws:Company
      /@ws:PriorValue[.='A' or .='B' or .='C' or .='D' or .='E']
and ws:Eligibility='false'

Еще один способ - использовать contains функцию , например:

ws:Additional_Information
   /ws:Company
      /@ws:PriorValue[
         contains(' A B C D E ', concat(' ',.,' '))
      ]
and ws:Eligibility='false'
2 голосов
/ 11 марта 2019

Для упрощения первое выражение «test» имеет следующий вид:

@attr = 'A' or 'B'

В некоторых языках такой синтаксис даже не допускается.Фактически это то же самое, что и это:

(@attr = 'A') or ('B')

Вы спрашиваете " Является ли выражение attr = 'A' истиной ИЛИ является ли выражение 'B' истиной ?".В XSLT запрос " является ли выражение 'B' true? " фактически вернет true, потому что строка 'B' не пуста.Таким образом, все выражение всегда будет истинным независимо от значения атрибута.

Итак, вы должны написать @attr = 'A' or @attr = 'B' здесь.

Если вы ищете какой-то более короткий синтаксис, если вы можете использоватьXSLT 2.0, вы можете написать это:

@attr = ('a', 'b')

Что похоже на выражение " Равен ли @attr какому-либо значению в последовательности? "

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