我的xml看起来像
- <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 full xml在这里http://www.speedyshare.com/MgCCA/download/ItemMaster-2.xml
我需要使用属性TYPE =“BRAND”获取Classification的值,但是使用下面的代码,它只获取属性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.
答案 0 :(得分: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;
答案 1 :(得分:0)
我不确定你正在寻找什么样的地图。假设你想要的是(唯一的)'Code',在每个'ItemMasterHeader'上具有正确属性的'Classification'上,出现在单独的'row'文件夹内的输出中,这里是代码:
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'生成一个'row'文件夹,将每个'product_Info'文件夹放入其中,并在其中放置来自(Attribute)'Type'='BRAND'的'Classification'的代码
希望这会有所帮助。的问候,