Enterprise Architect:MDA 转换为 XSD 破坏了枚举属性

Enterprise Architect: MDA transformation to XSD breaks enumeration attributes

我尝试自定义 XSD PSM 的转换。其中一项自定义包含对源属性使用 XSDAttributes。这工作得很好,但我有一个关于枚举的顽固问题。 我的 PIM 包含一些 UML 枚举和 XSDSimpleType,它们已正确转换为 PSM。但是,当我的 PIM 包含一个 class 属性时,该属性具有这样一个枚举作为属性类型,转换似乎工作正常,但看起来 PSM 中的属性类型未连接到生成的枚举。这会导致后续生成的 XSD 架构抛出警告 "Warning no XSD type found for: 'Color'. Default is: xs:string"。如果我在 PSM 中手动 select 枚举 "Color",模式生成将在没有任何警告的情况下通过。使用 simpleTypes 我没有问题并且运行良好。

属性转换的可能相关部分是

Attribute {
  [...]
  name=%qt%$attName%qt%
  scope="Public"
  type=%qt%%attType%%qt%
  stereotype="XSDattribute"

class 转换的可能相关部分是

%if elemType == "Class"%
  Class
%else%
  Enumeration
%endIf%
  {
    name=%qt%%className%%qt%

中间文件的相关部分是:

Class
{
  name="Apple"
  stereotype="XSDcomplexType"
  [...]
Attribute
{
  [...]
  name="color"
  scope="Public"
  type="Color"
  stereotype="XSDattribute"
  [...]
}
}

Enumeration
{
  [...]
  name="Color"
  stereotype="enumeration"
  [...]
}

你能告诉我我在哪里搞砸了我的转型吗?

此致, 斯特凡

我遇到了类似的问题。我认为基本 XSD MDA 模板已损坏,因为他们将枚举作为元类型引入,不再是元类型 Class.

上的刻板印象

这是我修复它的方法:
Class 模板:

%if elemType != "Class" and elemType != "Enumeration" and elemType != "DataType"%
%endTemplate%


Class
{
  name=%qt%%className%%qt%
    %if classStereotype=="enumeration" or elemType == "Enumeration"%
      stereotype="enumeration"
    %elseIf elemType == "DataType"%
      stereotype="XSDsimpleType" 
    %else%
      stereotype="XSDcomplexType"
    %endIf%
  notes=%qt%%qt%
  %TRANSFORM_CURRENT("name","stereotype","notes")%
  %TRANSFORM_REFERENCE("XSDClass")%
%list="Attribute" @separator="\n" @indent="  "%
}

%list="Connector" @separator="\n" @indent="  "%

属性模板:

Attribute
{
  %TRANSFORM_REFERENCE()%
  %TRANSFORM_CURRENT("scope","type","notes")%
  scope="Public"
  type=%qt%%attType%%qt%
  notes=%qt%%qt%
%if attLowerBound!=""%
  Tag
  {
    name="minOccurs"
    value=%qt%%attLowerBound=="*" ? "unbounded" : value%%qt%
  }
%endIf%
%if attUpperBound!=""%
  Tag
  {
    name="maxOccurs"
    value=%qt%%attUpperBound=="*" ? "unbounded" : value%%qt%
  }
%endIf%
}