2013-07-02 44 views
-1

我需要在OSB流程中執行特定的XQuery轉換。由於密鑰而在其他列表中查找對象

輸入有以下形式:

<OBJECT_1> 
    <item> // multiplicy : * 
    <MONTH> 
    <INFO_11/> 
    <INFO_12/> 
    </item> 
</OBJECT_1> 
<OBJECT_2> 
    <item> // multiplicy : * 
    <INFO_21/> 
    <INFO_22/> 
    <MONTH/> 
    </item> 
</OBJECT_2> 

目標輸出具有這樣的結構:

<object1> // multiplicy : * 
    <month> 
    <info11/> 
    <info12/> 
    <object2> // multiplicy : * 
    <info21/> 
    <info22/> 
    </object2> 
</object1> 

眼下我XQuery的樣子:

declare function xf:myTransformation($z_SOURCE1 as element(ns1:SOURCE)) 
    as element(ns0:targetService) { 
     <ns0:targetService> 
      <myFlow> 
       { 
        for $item in $z_SOURCE1/ns1:OBJECT_1/ns1:item 
        return 
         <object1> 
          { 
           for $MONTH in $item/ns1:MONTH 
           return 
            <month>{ data($MONTH) }</month> 
          } 
          { 
           for $INFO_11 in $item/ns1:INFO_11 
           return 
            <info11>{ data($INFO_11) }</info11> 
          } 
          { 
           for $INFO_12 in $item/ns1:INFO_12 
           return 
            <info12>{ data($INFO_12) }</info12> 
          } 
          { 
          for $item0 in $z_SOURCE1/ns1:OBJECT_2/ns1:item 
          return 
           { 
           for $INFO_21 in $item0/ns1:INFO_21 
            return 
            <info21>{ data($INFO_21) }</info21> 
           } 
           { 
           for $INFO_22 in $item0/ns1:INFO_22 
            return 
            <info21>{ data($INFO_22) }</info22> 
           } 
         </object1> 
       } 
      </myFlow> 
     </ns0:targetService> 
}; 

正如你所看到的, OBJECT_1和OBJECT_2之間沒有「匹配」...

如何在OBJECT_2列表中找到與object1月份鍵匹配的對象(在SQL中爲:OBJECT_1.MONTH=OBJECT_2.MONTH)? 在構建OBJECT_1時,我可以走進OBJECT_2列表以查找我需要的鍵嗎?從OTN論壇發現

+0

我試$ item0在$ z_SOURCE1/NS1的'改變:OBJECT_2/NS1:item'用'的$ z_SOURCE1/ns1中的$ item0:OBJECT_2/ns1:item [KEY_MAPPING_OBJECT_1 = ../key [1]]'沒有大的成功。 – MTranchant

回答

0

答:

使用下面的XQuery: -

xquery version "1.0" encoding "Cp1252"; 
(:: pragma parameter="$anyType1" type="xs:anyType" ::) 
(:: pragma type="xs:anyType" ::) 


declare namespace xf = "http://tempuri.org/OSB%20Project%201/XQ/Test2/"; 


declare function xf:Test2($anyType1 as element(*)) 
    as element(*) { 
     let $input:= <STRUCTURE> 
    <OBJECT_1> 
     <item> 
     <MONTH>2013_M06</MONTH> 
     <INFO_11>ABC</INFO_11> 
     <INFO_12>2012-04-24</INFO_12> 
     </item> 
     <item> 
     <MONTH>2013_M05</MONTH> 
     <INFO_11>DEF</INFO_11> 
     <INFO_12>2012-04-24</INFO_12> 
     </item> 
    </OBJECT_1> 
    <OBJECT_2> 
     <item> 
     <MONTH>2013_M06</MONTH> 
     <INFO_21>11111</INFO_21> 
     <INFO_22>1</INFO_22> 
     </item> 
     <item> 
     <MONTH>2013_M06</MONTH> 
     <INFO_21>11111</INFO_21> 
     <INFO_22>2</INFO_22> 
     </item> 
     <item> 
     <MONTH>2013_M05</MONTH> 
     <INFO_21>22222</INFO_21> 
     <INFO_22>1</INFO_22> 
     </item> 
    </OBJECT_2> 
</STRUCTURE> 
let $month := fn:distinct-values($input/OBJECT_1//MONTH/text()) 
let $out:=<targetStructure>{ 
    for $x in 1 to fn:count($month) 
    return 
    <object1> 
    <month>{$month[$x]}</month> 
    <info_11>{$input/OBJECT_1/item[./MONTH=$month[$x]]/INFO_11/text()}</info_11> 
    <info_12>{$input/OBJECT_1/item[./MONTH=$month[$x]]/INFO_12/text()}</info_12> 
    {for $y in $input/OBJECT_2/item 
    where $y/MONTH/text()=$month[$x] 
    return 
    <object2> 

    <info_21>{$y/INFO_21/text()}</info_21> 
    <info_22>{$y/INFO_22/text()}</info_22> 
    </object2>} 
    </object1> 
} 
</targetStructure> 


return $out 


}; 


declare variable $anyType1 as element(*) external; 


xf:Test2($anyType1) 
相關問題