xquery, чтобы проверить xquery, как проверить, является ли значение логической переменной истинным - PullRequest
0 голосов
/ 30 ноября 2018

Я пишу xquery, в котором я должен проверить, является ли значение атрибута истинным.Атрибут / элемент определяется как логическое значение.Я пробовал несколько вариантов, но не могу получить правильное значение, логика работает для других элементов, но не для «MainCustomer», так как она определена как Boolean.Как я могу написать xquery для этого?

Ниже приведен пример моего запроса:

<Maintenance xmlns="*******">
<AccountPersons>
  <APH AccountID="56987" LastFinancialRespSwitch="Y" LastMainCustomerSwitch="Y" LastPersonID="987569" QuickAddSwitch="false"/>
  <APR AccountID="98759" AccountRelationshipType="MIN" BillAddressSource="PER" PersonID="000000" MainCustomer="true"></APR>
  <APR AccountID="123456" AccountRelationshipType="MAIN" BillAddressSource="PERSON" PersonID="123456" MainCustomer="false"></APR>
</AccountPersons>
</Maintenance>

Я использую оператор if внутри для loop.APR является массивом.Я хочу получить значение BillAddressSource только из тех APR, где MainCustomer = "true" ниже xquery не работает, это дает мне значения из всех APR.

 if (fn:boolean($MaintenanceResponse/ns1:AccountPersons/ns1:APR[$position]/@MainCustomer))
    then
       <acc:data>      
               {if ($MaintenanceResponse/ns1:AccountPersons/ns1:APR[$position]/@BillAddressSource)
                then <acc:addressSource>{fn:data($MaintenanceResponse/ns1:AccountPersons/ns1:APR[$position]/@BillAddressSource)}</acc:addressSource>
                else ()
            }
       </acc:data> 

Еще один xquery, который я пробовал, этовыдает синтаксическую ошибку

        if ($MaintenanceResponse/ns1:AccountPersons/ns1:APR[$position]/@MainCustomer='true')
    then
       <acc:data>      
               {if ($MaintenanceResponse/ns1:AccountPersons/ns1:APR[$position]/@BillAddressSource)
                then <acc:addressSource>{fn:data($MaintenanceResponse/ns1:AccountPersons/ns1:APR[$position]/@BillAddressSource)}</acc:addressSource>
                else ()
            }
       </acc:data>  

Пожалуйста, помогите мне найти правильное утверждение if.Заранее спасибо

1 Ответ

0 голосов
/ 30 ноября 2018

Во-первых, это немного зависит от того, поддерживает ли ваш запрос / процессор схему.(Существует ли объявление «схемы импорта»?)

Действующее логическое значение атрибута равно true, если атрибут существует, независимо от его значения и независимо от того, проверяются ли данные в схеме.И if (@married) ..., и if (boolean(@married)) ... проверяют действующее логическое значение.

Если вы хотите проверить, что атрибут существует и имеет значение 'true' или '1', используйте приведение: if (xs:boolean(@married)) ....Это будет работать независимо от того, введены данные или нет (путем проверки схемы).Обратите внимание на различие между функцией boolean() (иногда пишется fn:boolean()), которая получает эффективное логическое значение, и функцией xs:boolean() cast или constructor, которая выполняет преобразование данных.

Если данныенетипизированный, вы можете использовать if (@married = 'true'), но это приведет к ошибке типа, если данные введены как логические.Кроме того, он не проверяет все допустимые логические значения («истина», «1», «1» и т. Д.).

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

  • if (data(@married)) ..., но нет реальной причины предпочитать это.

  • if (@married = true()) - выражение @married = true()возвращает true, если атрибут существует и равен true, false, если он не существует или равен false

  • if (@married eq true()) - выражение @married eq true() возвращает true, если атрибут существует и равен true, false, если он существует и false, () (пустая последовательность), если атрибут не существует;Эффект возврата () в контексте if() аналогичен возвращению false.Использование «eq» вместо «=» может привести к небольшому выигрышу в производительности.

Если вы проверяете на ложность (опять-таки, предполагая, что введенные данные), различие между @married = false() и @married eq false() и @married != true() и not(@married = true()) более тонкие.Если @married не существует, то любое сравнение с использованием =, eq, !=, ne фактически ложно, независимо от того, является ли другой операнд true() или false().Так что not(@married = true()) не означает то же самое, что (@married != true()), и не означает то же самое, что (@married = false()).

Я мог бы перейти к страницам об этом.В моей книге (Справочник программиста по XSLT 2.0 и XPath 2.0) я делаю именно это (см. Стр. 581–592).

...