【问题标题】:Getting distinct Values from XML in java, OSB, XQuery在 java、OSB、XQuery 中从 XML 中获取不同的值
【发布时间】:2013-12-27 22:40:22
【问题描述】:
<data>  
  <info>  
    <name>A</name>  
  </info>  
  <info>  
    <name>B</name>  
  </info>  
  <info>  
    <name>A</name>  
  </info>  
<info>  
    <name>C</name>  
  </info>  
<info>  
    <name>B</name>  
  </info>  
</info>  

有什么方法可以在 java 或 OSB 或 Xquery 中获得结果 distinct-values 在 Oracle 服务总线中不起作用,所以我想制作 java 方法来获取唯一名称

<data>  
<info>  
<name>A</name>  
</info>  
<info>  
<name>B</name>  
</info>   
<info>  
<name>C</name>  
</info>  
</data>  

【问题讨论】:

  • 你已经尝试过什么?请显示一些代码。您想如何执行 XQuery?正如你已经提到的distinct-values,差不多就是这样......

标签: java xml xquery osb oracle-service-bus


【解决方案1】:

我假设您想根据名称值对所有信息元素进行分组,并从每个组中只输出一个信息?

let $data :=
<data>  
  <info>  
    <name>A</name>  
  </info>  
  <info>  
    <name>B</name>  
  </info>  
  <info>  
    <name>A</name>  
  </info>  
  <info>  
    <name>C</name>  
  </info>  
  <info>  
    <name>B</name>  
  </info>  
</data>  
return
  <data>{
    let $distinct-names := distinct-values($data/info/name)
    for $name in $distinct-names
    let $infos := $data/info[name eq $name]
    return
      $infos[1]
  }</data>

我认为您也可以使用“分组依据”扩展:

let $data :=
<data>  
  <info>  
    <name>A</name>  
  </info>  
  <info>  
    <name>B</name>  
  </info>  
  <info>  
    <name>A</name>  
  </info>  
  <info>  
    <name>C</name>  
  </info>  
  <info>  
    <name>B</name>  
  </info>  
</data>  
return
  <data>{
    for $info in $data/info
    group $info as $infos by $info/name as $name
    return 
      $infos[1]
  }</data>

以上两个查询都返回:

<data>
  <info><name>A</name></info>
  <info><name>B</name></info>
  <info><name>C</name></info>
</data>

【讨论】:

  • group by 需要 XQuery 3.0,这是 Oracle 不支持的 afaik。不过使用distinct-values 很好。
  • Jens Erat - 你说得对,OSB 还不支持 XQuery 3.0。但是,在我的示例中使用的 group by 不是标准的 group by 子句,它是 Oracle/BEA group by extension。任何一个查询都应该有效。见:docs.oracle.com/cd/E13162_01/odsi/docs10gr3/xquery/…
  • 但我没有不同的值。是否按完美分组?
  • 如果我有以下 A11B 12A11C13 B12O-level 结果应该为 A11B12C13O-level
  • 如果您使用 OSB,我希望您 确实 具有不同的值。那么,如果两个信息元素具有相同的名称但不同的年龄值,您希望发生什么?结果中是同时出现还是只出现一个?例如A1A2
【解决方案2】:

我已经这样解决了

<CUSTOMER_NO_1>{ 
    (for $test in fn:distinct-values($data_ENV1/ns0:data/ns0:CUST/ns0:CUSTNO)
        return $test)[1]
}</CUSTOMER_NO_1>
<CUSTOMER_NO_2>{    
    (for $test in fn:distinct-values($data_ENV1/ns0:data/ns0:CUST/ns0:CUSTNO)
        return $test)[2]
}</CUSTOMER_NO_2>
<CUSTOMER_NO_3>{    
    (for $test in fn:distinct-values($data_ENV1/ns0:data/ns0:CUST/ns0:CUSTNO)
        return $test)[3]
}</CUSTOMER_NO_3>
<CUSTOMER_NO_4>{    
    (for $test in fn:distinct-values($data_ENV1/ns0:data/ns0:CUST/ns0:CUSTNO)
        return $test)[4]
}</CUSTOMER_NO_4>
<CUSTOMER_NO_5>{    
    (for $test in fn:distinct-values($data_ENV1/ns0:data/ns0:CUST/ns0:CUSTNO)
        return $test)[5]
}</CUSTOMER_NO_5>
<CUSTOMER_NO_6>{    
    (for $test in fn:distinct-values($data_ENV1/ns0:data/ns0:CUST/ns0:CUSTNO)
        return $test)[6]
}</CUSTOMER_NO_6>
<CUSTOMER_NO_7>{    
    (for $test in fn:distinct-values($data_ENV1/ns0:data/ns0:CUST/ns0:CUSTNO)
        return $test)[7]
}</CUSTOMER_NO_7>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多