Oracle OSM-XQuery不循环
我使用的是OSM 7.2.0.3,我有一个带有订单识别规则的盒式磁带,其订单数据规则位于转换选项卡中 在ODR中,我有以下XQuery代码:Oracle OSM-XQuery不循环,oracle,xquery,oracle-osm,Oracle,Xquery,Oracle Osm,我使用的是OSM 7.2.0.3,我有一个带有订单识别规则的盒式磁带,其订单数据规则位于转换选项卡中 在ODR中,我有以下XQuery代码: declare namespace im="http://xxx"; declare namespace xs="http://www.w3.org/2001/XMLSchema"; declare variable $ord := fn:root(.)/im:Order; <_root> <Order> {
declare namespace im="http://xxx";
declare namespace xs="http://www.w3.org/2001/XMLSchema";
declare variable $ord := fn:root(.)/im:Order;
<_root>
<Order>
{
for $moli in $ord/MainOrderLineItem
return
$moli/LineItemAttributeInfo/LineItemAttribute
}
</Order>
</_root>
OSM的XML输入为:
<ord:CreateOrder
xmlns:ord="http://xmlns.oracle.com/communications/ordermanagement">
<im:Order xmlns:im="http://xxx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.oracle.com/communications/sce/dictionary/BaseOrderCommonCartridge/DataDictionary_BaseOrderCommon ../dataDictionary/DataDictionary_BaseOrderCommon.xsd">
<OrderHeader>
<OrderID>12345</OrderID>
<RevisionNumber>1</RevisionNumber>
</OrderHeader>
<MainOrderLineItem>
<LineItemAttributeInfo>
<LineItemAttribute>
<AttributeID>1234</AttributeID>
</LineItemAttribute>
</LineItemAttributeInfo>
</MainOrderLineItem>
<MainOrderLineItem>
<LineItemAttributeInfo>
<LineItemAttribute>
<AttributeID>5678</AttributeID>
</LineItemAttribute>
</LineItemAttributeInfo>
</MainOrderLineItem>
<MainOrderLineItem>
<LineItemAttributeInfo>
<LineItemAttribute>
<AttributeID>abcd</AttributeID>
</LineItemAttribute>
</LineItemAttributeInfo>
</MainOrderLineItem>
</im:Order>
</ord:CreateOrder>
共出现3次,但输出仅为1:
<LineItemAttribute xmlns:im="http://xxx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<AttributeID>1234</AttributeID>
</LineItemAttributeInfo>
为什么不循环呢
非常感谢您的回复 问题在于:
declare variable $ord := fn:root(.)/im:Order;
必须是:
declare variable $ord := fn:root(.)/*/im:Order;
回答这个问题可能太迟了,但最有可能的问题是for语句中的节点选择表达式。选择多个MainOrderLineItems的正确方法:
for $moli in $ord//MainOrderLineItem
请注意$ord后面的双正斜杠
“/abcde”路径表达式选择根元素“abcde”
“parent//abcde”路径表达式选择parent下名为“abcde”的所有子元素
由于存在多个MainOrderLineItem节点,因此路径表达式需要包含“/”我刚刚使用了您的XQuery并选中了它,这很好。尝试在控制台中打印$ord变量,以查看您在OSM中实际得到了什么 这是我在任何XQuery ide中尝试的:
declare namespace im="http://xxx";
declare variable $ord1 := <ord:CreateOrder
xmlns:ord="http://xmlns.oracle.com/communications/ordermanagement">
<im:Order xmlns:im="http://xxx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.oracle.com/communications/sce/dictionary/BaseOrderCommonCartridge/DataDictionary_BaseOrderCommon ../dataDictionary/DataDictionary_BaseOrderCommon.xsd">
<OrderHeader>
<OrderID>12345</OrderID>
<RevisionNumber>1</RevisionNumber>
</OrderHeader>
<MainOrderLineItem>
<LineItemAttributeInfo>
<LineItemAttribute>
<AttributeID>1234</AttributeID>
</LineItemAttribute>
</LineItemAttributeInfo>
</MainOrderLineItem>
<MainOrderLineItem>
<LineItemAttributeInfo>
<LineItemAttribute>
<AttributeID>5678</AttributeID>
</LineItemAttribute>
</LineItemAttributeInfo>
</MainOrderLineItem>
<MainOrderLineItem>
<LineItemAttributeInfo>
<LineItemAttribute>
<AttributeID>abcd</AttributeID>
</LineItemAttribute>
</LineItemAttributeInfo>
</MainOrderLineItem>
</im:Order>
</ord:CreateOrder>;
let $ord := $ord1/im:Order
return
(
for $moli in $ord/MainOrderLineItem
return
$moli/LineItemAttributeInfo/LineItemAttribute
)
而结果只和预期的一样
<LineItemAttribute xmlns:im="http://xxx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ord="http://xmlns.oracle.com/communications/ordermanagement">
<AttributeID>1234</AttributeID>
</LineItemAttribute>
<LineItemAttribute xmlns:im="http://xxx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ord="http://xmlns.oracle.com/communications/ordermanagement">
<AttributeID>5678</AttributeID>
</LineItemAttribute>
<LineItemAttribute xmlns:im="http://xxx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ord="http://xmlns.oracle.com/communications/ordermanagement">
<AttributeID>abcd</AttributeID>
</LineItemAttribute>
您的查询和输出似乎与输出不匹配-来自哪里?不管怎样,查询本身看起来很好,但我无法向Oracle告诉您任何事情。顺便说一句,您的查询可以缩写为$ord/MainOrderLineItem/LineItemAttributeInfo/LineItemAttribute。这不起作用。当您向OSM提交订单XML时,默认情况下,它会查找、等并删除该元素。因此,OSM处理的只是属于其子元素的元素。因此fn:root./im:Order;是正确的。@WillSumekar,这个问题被标记为xquery,所以我发布了一个纯xquery解决方案。请适当地标记。我想将它标记为xquery、oracle osm,但我没有找到oracle osm或任何类似的东西,而且我没有能力创建新的标记。此外,我在最初的问题中提到了OSM。无论如何,这个问题仍然没有答案。感谢你的回答。