2010-03-26 14 views
9

我想指定fieldnamefreetext必须始终存在于适用于此XSD的XML文件中。有没有办法做到这一点?如何在XML模式中指定必须存在两个字段中的任何一个?

<xs:complexType name="tSome"> 
<xs:sequence> 
    <!-- either one of the two below has to be present. --> 
    <xs:element name="fieldname" type="xs:string" /> 
    <xs:element name="freetext" type="xs:string" /> 
    <!-- this one below must always be present --> 
    <xs:element name="dbtablename" type="xs:string" /> 
</xs:sequence> 
</xs:complexType> 
+0

我真的很抱歉,但以前minOccurs标签,那里只有因为我的选择的实现是fieldname和freetext只是可选的。 – 2010-03-29 10:59:02

回答

17

有一个在XML Schema,它可以让你把所包含的元素之一Choice Indicator,而不是两个或更多。如果你想3任2,我建议做这样的事情:

<xs:choice> 
    <xs:element name="fieldname" type="xs:string" minOccurs="0" maxOccurs="1" /> 
    <xs:element name="freetext" type="xs:string" minOccurs="0" maxOccurs="1" /> 
    <xs:element name="dbtablename" type="xs:string" minOccurs="0" maxOccurs="1" /> 
</xs:choice> 
<xs:choice> 
    <xs:element name="fieldname" type="xs:string" minOccurs="0" maxOccurs="1" /> 
    <xs:element name="freetext" type="xs:string" minOccurs="0" maxOccurs="1" /> 
    <xs:element name="dbtablename" type="xs:string" minOccurs="0" maxOccurs="1" /> 
</xs:choice> 

(也许maxOccurs会阻止你选择同一个元素两次) 如果还是不行,什么都不会,我认为。

编辑:我第一次没有正确理解这个问题。如果你想dbtablename始终存在与fieldnamefreetext任何一个,那么这就是答案:

<xs:complexType name="tSome"> 
<xs:sequence> 
    <xs:choice> 
    <xs:element name="fieldname" type="xs:string" /> 
    <xs:element name="freetext" type="xs:string" /> 
    </xs:choice> 
    <xs:element name="dbtablename" type="xs:string" /> 
</xs:sequence> 
</xs:complexType> 
+0

非常感谢!必须尝试如何选择minoccurs和maxoccurs。我接受后面的答案,如果它有效,尽管你的例子不是我所需要的。干杯! – 2010-03-26 15:08:08

+0

对不起:周末发生:字段名或自由文本,而不是两个。 dbtablename始终。看到我编辑的原始问题(为什么minOccurs标签在那里)。我现在的问题是:现在它真的是'fieldname或freetext,而不是两个',因为它有minOccurs标签。这又是我的错误。问题,但你不觉得他们应该被删除? – 2010-03-29 11:02:29

+0

@matti它们可以被删除,因为minOccures =“0”不会做任何事情。 – 2010-03-29 12:01:06

4

所以,你想要么fieldnamefreetext,而不是两者兼而有之?或者两者兼得?然后选择dbtablename

这里是1或2的元素:

<xs:choice minOccurs="1" maxOccurs="2"> 
    <xs:element name="fieldname" type="xs:string"/> 
    <xs:element name="freetext" type="xs:string"/> 
    <xs:element name="dbtablename" type="xs:string"/> 
</xs:choice> 

这是你想要的吗?还是你想要dbtablename分开?

+0

抱歉:周末发生:无论是fieldname还是freetext。 dbtablename始终。选择的问题是xsd.exe会为其生成奇怪的代码。 – 2010-03-29 10:55:02

+0

是:fieldname或freetext,而不是两者。 – 2010-03-29 10:55:33

+0

minOccurs =“1”maxOccurs =“2”是什么意思? – 2010-03-29 10:59:40

相关问题