处理 xsd:: list 类型的元素

XML 模式规范允许元素或属性包含一列值,用空格将各个简单类型的值分开。

请参阅以下 XML 输入消息:
   <message1>
     <listE1 listAttr="one two three"> four five six</listE1>
   </message1> 

在得到的消息树中,xsd::list 类型表示为一个名称节点,该节点的每个列表项都有一个匿名值子节点。这样便可以在不丢失任何信息的情况下处理重复的列表。

重复的列表将显示为同代名称元素,其中每个元素的每个列表项都有自己的匿名值子代。上述消息示例将生成以下逻辑树:
   MRM
listEl (Name)
listAttr (Name)
"one" (Value)
"two" (Value)
"three" (Value)
"four" (Value)
"five" (Value)
"six" (Value)
各个列表项可以作为 ElementName.*[n] 访问。例如:
  SET OutputRoot.MRM.listEl.listAttr.*[3] = ...
修改 listAttr 的第三项。

列表和重复元素之间的映射

请参阅以下 XML 输入消息的格式:
   <MRM>
     <inner>abcde fghij 12345</inner>
   </MRM> 
其中,元素 inner 属于 xsd::list 类型,因此它有三个关联的字符串值,而不是一个值。
如果要将这三个值复制到输出消息中,其中每个值都与重复元素的实例关联,如下所示:
   <MRM>
     <str1>abcde</str1>
     <str1>fghij</str1>
     <str1>12345</str1>
   </MRM> 
可以假设以下 ESQL 语法可用:
   DECLARE D INTEGER;
   SET D = CARDINALITY(InputBody.str1.*[]);
   DECLARE M INTEGER 1;
   WHILE M <= D DO
      SET OutputRoot.MRM.str1[M] = InputBody.inner.*[M];
      SET M = M + 1;
   END WHILE;
但是,语句:
   SET OutputRoot.MRM.str1[M] = InputBody.inner.*[M];
请求将树从源复制到目标。由于目标元素还不存在,因此要从源创建它并设置它的值和类型

这与 ESQL 在别处的行为一致,但在元素具有 list 类型值的情况下,此代码会产生虚假的验证错误。

要避免发生此问题,建议您使用 FIELDVALUE 函数 只明确检索“源”元素的值,如下所示:
      SET OutputRoot.MRM.str1[M] = FIELDVALUE(InputBody.inner.*[M]);
相关任务
正在开发 ESQL
访问消息体中的元素
相关参考
SET 语句
FIELDVALUE 函数
声明 | 商标 | 下载 | 书库 | 支持 | 反馈
Copyright IBM Corporation 1999, 2006 最后一次更新时间:2006/08/14
ak05141_