- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 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++ code generator似乎不同意:
error: attribute 'type' is already defined in base
这个应该怎么写?我只希望 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;
};
现在,其中一个 child 可以这样实现:
class Signal : public Event
{
public:
Signal() : Event( "signal" ){}
};
如您所见,子类定义了基类定义的属性值。甚至可以用 xsd 表达吗?
最佳答案
要派生类型并固定值,请使用 restriction :
<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>
通过阅读规范,我本以为您会 couldn't add attributes in a restriction除非基类型有 attribute 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>
另一个修复方法是添加 attribute wildcard到基本类型。
<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>
这不是等效的解决方案,因为它允许事件具有任何属性(这可能是不受欢迎的,一般来说,但可能不是代码生成),并且它不添加额外的类型(这是可取的)。
请注意,基数中的任何粒子(元素、组或通配符)都必须是 repeated in the restriction ,否则它们将不允许出现在元素中。如果基础上需要限制属性,则限制中也必须需要它。限制必须满足许多其他属性才能成为有效的 derivation或 particle .该规范不是那么可读,但您通常可以偶然发现它。
另请参阅:“how to use restrictions and extensions in XSD simultanously ”。
关于c++ - XSD : How to set attributes values in children element type?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4199180/
我是一名优秀的程序员,十分优秀!