XML 映射编辑器发行说明

© Copyright International Business Machines Corporation 2005. All rights reserved.US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.

发行说明

1.0 描述
2.0 局限性
3.0 已知问题和变通方法
   3.1 如果 minOccurs 不是 0 或 1,将逐个显示数组的元素
   3.2 为组引用定义常量映射时,生成不正确的 XSL
   3.3 使用组引用执行数组子映射时,生成不正确的 XSL

1.0 描述

此发行说明文件包含有关 WebSphereR Integration Developer XML 映射编辑器的局限性以及已知问题和变通方法的最新信息。

2.0 局限性

3.0 已知问题和变通方法

3.1 如果 minOccurs 不是 0 或 1,将逐个显示数组的元素

如果在 XSD 模式中使用 minOccurs 不等于 0 或 1 定义元素,类似以下内容:

<element maxOccurs="max_integer" minOccurs="min_integer" name="elementName" type="yourType"/>

其中:

将此 XSD 模式用作源或目标时,XML 映射编辑器中将显示两个或多个 elementName 条目。如果执行从父元素到 elementName 的匹配映射,则 elementName 将被映射多次,并且可能产生不需要的映射。

变通方法 1:
在从父元素执行匹配映射之前,映射每个 elementName 条目。

变通方法 2:
将 minOccurs 设置为 0 或 1。

3.2 为组引用定义常量映射时,生成不正确的 XSL

假定 XSD 模式中有一种使用组引用的复杂类型,类似于以下示例:

<complexType name="MyType1">
    <sequence>
      <group ref="xsd1:myType1"/>
    </sequence>
</complexType>

  <group name="myType1">
    <sequence>
      <element name="emplID">
 <simpleType>
          <restriction base="int"/>
        </simpleType>       
      </element>
      <element name="location">      
        <simpleType>
          <restriction base="string">
            <maxLength value="10"/>
          </restriction>
 </simpleType>
      </element>
      <element name="data">       
        <simpleType>
          <restriction base="string">
            <maxLength value="1"/>
          </restriction>
        </simpleType>
      </element>
    </sequence>
  </group>

如果在 XML 映射编辑器中选择此 XSD 模式作为目标并尝试将 emplID 映射至一个常量值,则从此映射生成的 XSL 将不正确。

以下是变通方法:

  1. 首先将元素(emplID)映射至源树中的根元素,然后使用定义 XSLT 函数...分配常量值。
  2. 将组中的剩余元素(locationdata)映射至需要的值。

生成的 XSL 结果将是正确的。

3.3 使用组引用执行数组子映射时,生成不正确的 XSL

假定模式 1 具有以下内容:

<xsd:complexType name="Raw_Materials_Type">
    <xsd:sequence>
      <xsd:element minOccurs="0" name="materialid" type="xsd:int"/>
      <xsd:element minOccurs="0" name="quantity" type="xsd:int"/>     
    </xsd:sequence>
</xsd:complexType>

<xsd:element maxOccurs="unbounded" minOccurs="1" name="RawMaterials" type="Raw_Materials_Type"/>
     
假定模式 2 具有以下内容:

<xsd:element maxOccurs="3" minOccurs="3" name="MaterialDataSet" type="reservedmaterialdataset"/>
<complexType name="reservedmaterialdataset">
    <sequence>
      <group ref="xsd1:reservedmaterialdatasetGroup"/>
    </sequence>
</complexType>
<group name="reservedmaterialdatasetGroup">
    <sequence>
      <element name="matID" type="xsd:int"/>
      <element name="qty" type="xsd:int"/>
    </sequence>
</group>

如果使用 XML 映射编辑器将模式 1 映射到模式 2,并尝试创建 Raw_materials 到 MaterialDataSet 的映射(包括所有子元素),则生成的 XSL 将不正确。

变通方法 1:
将模式 2 的 minOccurs="3" 更改为 minOccurs="0",并为这两个元素执行匹配映射。生成的 XSL 将是正确的。

变通方法 2:

  1. 创建映射(从 materialid 映射到第一个 MaterialDataSet/matID)
  2. 使用 XPath 表达式 /RawMaterials[1]/materialid/text() 为第一个 MaterialDataSet/matID 定义 XSLT 函数...
  3. 创建映射(从 quantity 映射到第一个 MaterialDataSet/qty)
  4. 使用 XPath 表达式 /RawMaterials[1]/quantity/text() 为第一个 MaterialDataSet/qty 定义 XSLT 函数...
  5. 创建映射(从 materialid 映射到第二个 MaterialDataSet/matID)
  6. 使用 XPath 表达式 /RawMaterials[2]/materialid/text() 为第二个 MaterialDataSet/matID 定义 XSLT 函数...
  7. 创建映射(从 quantity 映射到第二个 MaterialDataSet/qty)
  8. 使用 XPath 表达式 /RawMaterials[2]/quantity/text() 为第二个 MaterialDataSet/qty 定义 XSLT 函数...
  9. 创建映射(从 materialid 映射到第三个 MaterialDataSet/matID)
  10. 使用 XPath 表达式 /RawMaterials[3]/materialid/text() 为第三个 MaterialDataSet/matID 定义 XSLT 函数...
  11. 创建映射(从 quantity 映射到第三个 MaterialDataSet/qty)
  12. 使用 XPath 表达式 /RawMaterials[3]/quantity/text() 为第三个 MaterialDataSet/qty 定义 XSLT 函数...
  13. 保存映射并生成 XSL
  14. 打开 XSL 文件并查找类似以下的结构:
        <xsl:template name="MaterialDataSet">
             <reservedRawMatDataSet>
        ...
        <xsl:template name="MaterialDataSet_1">
             <reservedRawMatDataSet>
        ...
        <xsl:template name="MaterialDataSet_2">
             <reservedRawMatDataSet>
        ...
  15. 查找以下行:
     <xsl:call-template name="MaterialDataSet"/>
  16. 在该行后面追加下列行:

    <xsl:call-template name="MaterialDataSet_1"/>
    <xsl:call-template name="MaterialDataSet_2"/>

现在,就可以正确调用 XSL 模板以与在 XML 映射编辑器中映射的内容匹配了。