2013-05-10 4 views
0

мой XML выглядитLASTMOVE петля не работает

- <ItemMaster> 
    - <ItemMasterHeader> 
     + <ItemID> 
     + <ItemStatus> 
     + <UserArea> 
     - <Classification Type="HOMOLOGATION CLASS"> 
      - <Codes> 
      <Code>E</Code> 
      </Codes> 
     </Classification> 
     + <Classification Type="LP"> 
     + <Classification> 
     - <Classification Type="BRAND"> 
      - <Codes> 
       <Code>002</Code> 
      </Codes> 
     </Classification> 

Yhe полный XML здесь http://www.speedyshare.com/MgCCA/download/ItemMaster-2.xml

Мне нужно получить значение классификации с атрибутом TYPE = «BRAND», но с ниже код, его только выбирает классификацию с атрибутом TYPE = «HOMOLOGATION CLASS», который я не хочу, так как я призываю «BRAND». Я пытался применить LASTMOVE, но доцентную работу. Скажите, пожалуйста, где я ошибаюсь.

Мне также нужно получить другие значения, также как и коды внутри типа - «LP».

DECLARE rResource REFERENCE TO InputRoot.XMLNSC.*:SyncItemMaster.*:DataArea.*:ItemMaster.*:ItemMasterHeader[1]; 
     SET rowCnt = rowCnt+1;  
     DECLARE LineCount INTEGER 1; 

     WHILE LASTMOVE(rResource) = TRUE DO  
     SET OutputRoot.XMLNSC.root.row[rowCnt].product_Info.TyreBrandCd = THE (SELECT ITEM FIELDVALUE(T) FROM itemMaster.*:ItemMasterHeader[LineCount].*:Classification.*:Codes.*:Code AS T WHERE FIELDVALUE(itemMaster.*:ItemMasterHeader[LineCount].*:Classification.(XMLNSC.Attribute)Type) = 'BRAND'); 
      SET LineCount = LineCount + 1; 
     MOVE rResource NEXTSIBLING REPEAT TYPE NAME; 
     END WHILE;    
    RETURN TRUE; 
    END; 

Благодаря

опробованы ниже предложил код

Вот журналы трассировки

2013-05-10 18:32:27.218385 7732 UserTrace BIP2537I: Node 'WMB_9D1_PROD_SUB00_001.9D1_PROD': Executing statement ''SET temp = THE (SELECT T.Classification AS :Classification FROM myref AS T WHERE FIELDVALUE(T.Classification.(XMLNSC.Attribute)Type) = 'BRAND');'' at ('.WMB_9D1_PROD_SUB00_001.Main', '22.3'). 
2013-05-10 18:32:27.218393 7732 UserTrace BIP2538I: Node 'WMB_9D1_PROD_SUB00_001.9D1_PROD': Evaluating expression ''THE (SELECT T.Classification AS :Classification FROM myref AS T WHERE FIELDVALUE(T.Classification.(XMLNSC.Attribute)Type) = 'BRAND')'' at ('.WMB_9D1_PROD_SUB00_001.Main', '22.14'). 
2013-05-10 18:32:27.218400 7732 UserTrace BIP2572W: Node: 'WMB_9D1_PROD_SUB00_001.9D1_PROD': ('.WMB_9D1_PROD_SUB00_001.Main', '22.14') : Finding one and only SELECT result. 
2013-05-10 18:32:27.218427 7732 UserTrace BIP2539I: Node 'WMB_9D1_PROD_SUB00_001.9D1_PROD': Evaluating expression ''myref'' at ('.WMB_9D1_PROD_SUB00_001.Main', '22.48'). This resolved to ''myref''. The result was ''ROW... Root Element Type=16777216 NameSpace='' Name='ItemMasterHeader' Value=NULL''. 
2013-05-10 18:32:27.218437 7732 UserTrace BIP2539I: Node 'WMB_9D1_PROD_SUB00_001.9D1_PROD': Evaluating expression ''XMLNSC.Attribute'' at ('.WMB_9D1_PROD_SUB00_001.Main', '22.94'). This resolved to ''XMLNSC.Attribute''. The result was ''1095266992384''. 
2013-05-10 18:32:27.218446 7732 UserTrace BIP2540I: Node 'WMB_9D1_PROD_SUB00_001.9D1_PROD': Finished evaluating expression ''FIELDVALUE(T.Classification.(XMLNSC.Attribute)Type)'' at ('.WMB_9D1_PROD_SUB00_001.Main', '22.65'). The result was '''HOMOLOGATION CLASS'''. 
2013-05-10 18:32:27.218454 7732 UserTrace BIP2539I: Node 'WMB_9D1_PROD_SUB00_001.9D1_PROD': Evaluating expression ''FIELDVALUE(T.Classification.(XMLNSC.Attribute)Type) = 'BRAND''' at ('.WMB_9D1_PROD_SUB00_001.Main', '22.117'). This resolved to '''HOMOLOGATION CLASS' = 'BRAND'''. The result was ''FALSE''. 
2013-05-10 18:32:27.218461 7732 UserTrace BIP2569W: Node 'WMB_9D1_PROD_SUB00_001.9D1_PROD': ('.WMB_9D1_PROD_SUB00_001.Main', '22.14') : WHERE clause evaluated to false or unknown. Iterating FROM clause. 
2013-05-10 18:32:27.218469 7732 UserTrace BIP2570W: Node 'WMB_9D1_PROD_SUB00_001.9D1_PROD': ('.WMB_9D1_PROD_SUB00_001.Main', '22.14') : There were no items in the FROM clause satisfying the WHERE clause. 
2013-05-10 18:32:27.218503 7732 UserTrace BIP2567I: Node 'WMB_9D1_PROD_SUB00_001.9D1_PROD': Assigning NULL to ''temp'', thus deleting it. 

ответ

1

Попробуйте это:

declare temp ROW; 

SET temp = THE (SELECT T.Classification FROM rResource AS T WHERE FIELDVALUE(T.Classification.(XMLNSC.Attribute)Type) = 'BRAND'); 

OutputRoot.XMLNSC.root.row[rowCnt].product_Info.TyreBrandCd = temp.code; 
+0

Я проведу тест и дам вам знать – Yogus

+0

Не работает :( – Yogus

0

Я не уверен, что такое картография, которую вы ищете. Предполагая, что то, что вы хотите, для (уникального) «кода», в «Классификации» с правильным атрибутом на каждом «ItemMasterHeader», присутствовать на выходе в отдельных папках «строка», вот код:

CREATE PROCEDURE ExtractTyreCodes() BEGIN 
     DECLARE rOutput REFERENCE TO OutputRoot; 
     DECLARE rResource REFERENCE TO InputRoot.XMLNSC.*:SyncItemMaster.*:DataArea.*:ItemMaster; 
     CREATE FIELD OutputRoot.XMLNSC.root AS rOutput; 
     IF LASTMOVE(rResource) THEN 
     SET rOutput.row[] = SELECT 
       THE(SELECT C.*:Codes.*:Code AS TyreBrand 
        FROM T.*:Classification[] AS C 
        WHERE C.(XMLNSC.Attribute)Type = 'BRAND') AS product_Info 
       FROM rResource.*:ItemMasterHeader[] AS T; 
     END IF; 
END; 

Начиная с этого сообщения:

<SyncItemMaster> 
    <DataArea> 
    <ItemMaster> 
     <ItemMasterHeader> 
     <ItemID/> 
     <ItemStatus/> 
     <UserArea/> 
     <Classification Type="HOMOLOGATION CLASS"> 
      <Codes> 
      <Code>E</Code> 
      </Codes> 
     </Classification> 
     <Classification Type="LP"/> 
     <Classification/> 
     <Classification Type="BRAND"> 
      <Codes> 
      <Code>002</Code> 
      </Codes> 
     </Classification> 
     </ItemMasterHeader> 
     <ItemMasterHeader> 
     <ItemID/> 
     <ItemStatus/> 
     <UserArea/> 
     <Classification Type="HOMOLOGATION CLASS"> 
      <Codes> 
      <Code>F</Code> 
      </Codes> 
     </Classification> 
     <Classification Type="LP"/> 
     <Classification/> 
     <Classification Type="BRAND"> 
      <Codes> 
      <Code>005</Code> 
      </Codes> 
     </Classification> 
     </ItemMasterHeader> 
    </ItemMaster> 
    </DataArea> 
</SyncItemMaster> 

Вы получаете это сообщение:

<root> 
    <row> 
    <product_Info> 
     <TyreBrand>002</TyreBrand> 
    </product_Info> 
    </row> 
    <row> 
    <product_Info> 
     <TyreBrand>005</TyreBrand> 
    </product_Info> 
    </row> 
</root> 

Это создает папку 'строки' для каждого 'ItemMasterHeader', помещает внутри каждого а 'PRODUCT_INFO' е старше и внутри этого кода помещает код из «Классификации» (Attribute) «Type» = «BRAND».

Надеюсь, это поможет. С уважением,

+0

@Sherin Спасибо, я вижу, но если мне нужно сделать дерево с другими значениями и на выходе, как и мне нужно также получить оттуда бренд, и он также должен пришлите insode тег product_info Я разработал xml-ссылку – Yogus

+0

@Deonia XML, который вы предоставляете, по-видимому, имеет серьезные проблемы с конструкцией. Он имеет повторяющийся элемент Classification/@ Type = "BRAND", где два экземпляра имеют разную структуру и контент Поэтому, когда вы фильтруете это значение атрибута («BRAND»), вы не можете быть уверены, что этот элемент содержит код или что-то еще, что вы ищете. Поэтому я рекомендую один из двух подходов: 1. Для использования специального цикла REPEAT с оператором CASE для извлечения необходимой информации из каждого тега. 2. Используйте код для извлечения всех элементов с заданным фильтром (сгладьте структуру). – Shrein

+0

Да, я знаю. XMl находится в плохом состоянии :( – Yogus