Oracle OSM-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> {

我使用的是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>
  {
    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。无论如何,这个问题仍然没有答案。感谢你的回答。