If statement xquery检查xquery如何检查布尔变量的值是否为真
我正在编写一个xquery,其中必须检查属性的值是否为true。属性/元素定义为布尔值。 我尝试了多个选项,但无法获得正确的值,该逻辑适用于其他元素,但不适用于“MainCustomer”,因为它是布尔定义的。我如何为它编写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
<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())
如果属性存在且为true,则返回true;如果属性不存在或为false,则返回false@married=true()
-表达式if(@married eq true())
如果属性存在且为true,则返回true;如果属性存在且为false,则返回false;如果属性不存在,则返回@married eq true()
(空序列);在()
上下文中返回if()
的效果与返回false相同。使用“eq”而不是“=”会给性能带来微小的好处()
@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())
如果属性存在且为true,则返回true;如果属性不存在或为false,则返回false@married=true()
-表达式if(@married eq true())
如果属性存在且为true,则返回true;如果属性存在且为false,则返回false;如果属性不存在,则返回@married eq true()
(空序列);在()
上下文中返回if()
的效果与返回false相同。使用“eq”而不是“=”会给性能带来微小的好处()
@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>