【问题标题】:xquery to check xquery how to check if value of boolean variable is truexquery 检查 xquery 如何检查布尔变量的值是否为真
【发布时间】:2018-11-29 22:25:51
【问题描述】:

我正在编写一个 xquery,我必须在其中检查属性的值是否为真。属性/元素定义为布尔值。 我尝试了多个选项,但无法获得正确的值,该逻辑适用于其他元素,但不适用于“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 语句。提前致谢

【问题讨论】:

    标签: if-statement boolean xquery


    【解决方案1】:

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

    如果属性存在,则该属性的有效布尔值为真,无论其值如何,也无论数据是否经过模式验证。 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() 的上下文中返回() 的效果与返回false 相同。使用“eq”而不是“=”可能会带来微小的性能优势。

    如果您正在测试 false(再次假设输入数据),@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 页)。

    【讨论】:

    • 谢谢迈克尔。是的,我有进口申报。我没有提到完整的 xquery。我必须测试你提到的第二个条件。这是检查属性是否存在以及它的值是否为真。将 xs:boolean(@married) 正确答案。它不应包含除 true 之外的任何其他值。我试过 if(@married='true') 验证错误。
    • 如果您知道它是输入的,您还可以测试if (@married = true())if (@married eq true()) - 我会将这些选项添加到答案中。
    • 非常感谢迈克尔。这两个选项都有效。 xs:boolen(@married), if(@married=true())
    • 如何在退货声明中使用它?
    • @chovy 不要将补充问题作为对不同问题答案的评论。提出一个新问题,并详细说明您正在努力实现的目标以及您遇到的问题。如果相关,您可以随时交叉引用此问题/答案。
    猜你喜欢
    • 1970-01-01
    • 2019-08-07
    • 2021-11-07
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多