0

在 xsd 文件中,我有这个元素基本类型:

<xs:complexType name="event" abstract="true" >
    <xs:attribute name="move" type="aos:move_ref" use="required" />
    <xs:attribute name="type" type="aos:event_type" use="required" />
</xs:complexType>

我想type在子类型中定义属性的值,所以我尝试了这个:

<xs:complexType name="signal" >
    <xs:complexContent>
      <xs:extension base="aos:event">
        <xs:attribute name="type" type="aos:event_type" fixed="signal" />
        <xs:attribute name="source" type="aos:signal_source" use="required" />
      </xs:extension>
    </xs:complexContent>
 </xs:complexType>

Visual Studio 似乎并不介意,但CodeSynthesis C++ 代码生成器似乎不同意:

错误:属性“类型”已在基础中定义

我该怎么写这个?我只希望type属性的值特定于每个不同的子类型。

编辑 - -

为了使问题更清楚,我将用 C++ 编写我想做的同样的事情。

这是基类:

class Event
{
public:

   std::string name() const { return m_name; }

protected:

   // we need the child class to set the name
   Event( const std::string& name ) : m_name( name ) {} 

   // it's a base class
   virtual ~Event(){}

private:

   std::string m_name;

};

现在,其中一个孩子可以这样实现:

class Signal : public Event
{
public:

   Signal() : Event( "signal" ){}

};

如您所见,子类定义了由基类定义的属性值。甚至可以用xsd表达吗?

4

1 回答 1

2

要派生类型并修复值,请使用限制

<xs:complexType name="signal" >
    <xs:complexContent>
      <xs:restriction base="aos:event">
        <xs:attribute name="type" type="aos:event_type" fixed="signal" use="required" />
        <xs:attribute name="source" type="aos:signal_source" use="required" />
      </xs:restriction>
    </xs:complexContent>
 </xs:complexType>

通过阅读规范,我预计您不能在限制中添加属性,除非基本类型具有属性 wildcard,但 W3C XSD 验证器接受上述内容。如果遇到问题,可以将定义分解为限制和扩展:

<xs:complexType name="fixedSignalEvent">
  <xs:complexContent>
    <xs:restriction base="aos:event">
      <xs:attribute name="type" type="aos:event_type" fixed="signal" use="required" />
    </xs:restriction>
  </xs:complexContent>
</xs:complexType>

<xs:complexType name="signal" >
  <xs:complexContent>
    <xs:extension base="aos:fixedSignalEvent">
      <xs:attribute name="source" type="aos:signal_source" use="required" />
    </xs:extension>
  </xs:complexContent>
</xs:complexType>

另一个解决方法是将属性通配符添加到基本类型。

<xs:complexType name="event" abstract="true" >
    <xs:attribute name="move" type="aos:move_ref" use="required" />
    <xs:attribute name="type" type="aos:event_type" use="required" />
    <xs:anyAttribute />
</xs:complexType>

这不是等效的解决方案,因为它允许事件具有任何属性(一般来说,这可能是不可取的,但可能不适用于代码生成),并且它不会添加额外的类型(这是可取的) .

请注意,base 中的任何粒子(元素、组或通配符)必须在限制中重复,否则它们将不允许在元素中。如果在基础上需要限制属性,则限制中也必须要求它。限制必须满足许多其他属性才能成为有效的推导粒子。该规范不是那么可读,但您通常可以偶然发现它。

另请参阅:“如何在 XSD 中同时使用限制和扩展”。

于 2010-11-21T00:54:13.790 回答