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

If statement xquery检查xquery如何检查布尔变量的值是否为真,if-statement,boolean,xquery,If Statement,Boolean,Xquery,我正在编写一个xquery,其中必须检查属性的值是否为true。属性/元素定义为布尔值。 我尝试了多个选项,但无法获得正确的值,该逻辑适用于其他元素,但不适用于“MainCustomer”,因为它是布尔定义的。我如何为它编写xquery 以下是我的请求示例: <Maintenance xmlns="*******"> <AccountPersons> <APH AccountID="56987" LastFinancialRespSwitch="Y" LastM

我正在编写一个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>
我尝试的另一个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($maintenancesresponse/ns1:AccountPersons/ns1:APR[$position]/@MainCustomer='true'))
然后
{if($MaintenanceResponse/ns1:AccountPersons/ns1:APR[$position]/@BillAddressSource)
然后{fn:data($MaintenanceResponse/ns1:AccountPersons/ns1:APR[$position]/@BillAddressSource)}
else()
}

请帮我找到正确的if语句。首先,这取决于您的查询/处理器是否支持模式。(是否有“导入架构”声明?)

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

如果要测试该属性是否存在并具有值“true”或“1”,请使用强制转换:
If(xs:boolean(@married))…
。无论数据是否被类型化(通过模式验证),这都将起作用。请注意获取有效布尔值的
boolean()
函数(有时编写为
fn:boolean()
)与执行数据转换的
xs:boolean()
cast或构造函数之间的区别

如果数据是非类型化的,则可以使用
If(@married='true')
,但如果数据类型为布尔型,则此操作将失败并出现类型错误。此外,它不会测试所有合法的布尔值(“true”、“1”、“1”等)

如果您知道数据是通过架构验证键入的,则可以使用以下任一选项:

  • if(data(@marred))…
    但是没有真正的理由喜欢这个

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

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

如果测试的是false(再次假设输入数据),那么
@married=false()
@married eq false()
@married!=true()
不(@married=true())
更微妙。如果
@married
不存在,则使用
=
eq
进行任何比较=
ne
实际上是false,而不管另一个操作数是
true()
还是
false()
。因此,
not(@married=true())
(@married!=true())
的意思不一样,也与
(@married=false())
的意思不一样


关于这件事我可以写上几页。在我的书(XSLT 2.0和XPath 2.0程序员参考)中,我就是这么做的(参见第581至592页)。

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

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

如果要测试该属性是否存在并具有值“true”或“1”,请使用强制转换:
If(xs:boolean(@married))…
。无论数据是否被类型化(通过模式验证),这都将起作用。请注意获取有效布尔值的
boolean()
函数(有时编写为
fn:boolean()
)与执行数据转换的
xs:boolean()
cast或构造函数之间的区别

如果数据是非类型化的,则可以使用
If(@married='true')
,但如果数据类型为布尔型,则此操作将失败并出现类型错误。此外,它不会测试所有合法的布尔值(“true”、“1”、“1”等)

如果您知道数据是通过架构验证键入的,则可以使用以下任一选项:

  • if(data(@marred))…
    但是没有真正的理由喜欢这个

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

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

如果测试的是false(再次假设输入数据),那么
@married=false()
@married eq false()
@married!=true()
不(@married=true())
更微妙。如果
@married
不存在,则使用
=
eq
进行任何比较=
ne
实际上是错误的
        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>