我正在编写一个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语句。预先感谢
答案 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
,!=
,ne
,true()
进行的比较实际上是错误的,而与另一个操作数是否为{{1 }}或false()
。因此,not(@married = true())
并不等同于(@married != true())
,也不等同于(@married = false())
。
我可以继续浏览有关此的页面。在我的书(《 XSLT 2.0和XPath 2.0程序员参考》)中,我只是这样做了(请参阅第581至592页)。