xquery检查xquery如何检查布尔变量的值是否为真

时间:2018-11-29 22:25:51

标签: if-statement boolean xquery

我正在编写一个xquery,在其中必须检查属性的值是否为true。属性/元素定义为布尔值。 我尝试了多个选项,但无法获得正确的值,该逻辑适用于其他元素,但不适用于“ MainCustomer”,因为它定义为布尔值。如何为此编写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>

我在for循环中使用if语句。APR是一个数组。 我只想从MainCustomer =“ true”的那些APR中获取BillAddressSource的值 下面的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 :(得分:2)

首先,它在某种程度上取决于您的查询/处理器是否支持架构。 (是否有“导入模式”声明?)

如果属性存在,则属性的有效布尔值为true,而不管其值如何,以及数据是否经过架构验证。 if (@married) ...if (boolean(@married)) ...都测试有效的布尔值。

如果要测试属性是否存在并具有值'true'或'1',请使用强制转换:if (xs:boolean(@married)) ...。无论是否键入数据(通过模式验证),这都将起作用。请注意,boolean()函数(有时写为fn:boolean())和有效数据布尔值的xs:boolean()强制转换或构造函数之间是有区别的。

如果未键入数据,则可以使用if (@married = 'true'),但是如果将数据键入为布尔值,这将失败并出现类型错误。另外,它不会测试所有合法的布尔值(“ true”,“ 1”,“ 1”等)。

如果您知道数据已通过架构验证输入,则可以使用以下任何一种方法:

  • if (data(@married)) ...,但没有真正的理由更喜欢此。

  • if (@married = true())-如果属性存在且为true,则表达式@married = true()返回true,如果属性不存在或为false,则返回false

  • if (@married eq true())-如果属性存在且为true,则表达式@married eq true()返回true;如果属性存在且为false,则表达式()返回false;如果属性不存在,则表达式()(空序列)不存在;在if()的上下文中返回@married = false()的效果与返回false相同。使用“ eq”而不是“ =”可以带来很小的性能优势。

如果要测试是否为假(再次假设输入了数据),则@married eq false()@married != true()以及not(@married = true())@married之间的区别会更加微妙。如果=不存在,则使用eq!=netrue()进行的比较实际上是错误的,而与另一个操作数是否为{{1 }}或false()。因此,not(@married = true())并不等同于(@married != true()),也不等同于(@married = false())

我可以继续浏览有关此的页面。在我的书(《 XSLT 2.0和XPath 2.0程序员参考》)中,我只是这样做了(请参阅第581至592页)。