我试图验证这个XML文件...... 如果
<tag1>
为“Y”,然后<tag2>
必须出现
如果<tag1>
为“N”,则<tag2>
不得出现..
<parent>
<a>
<tag1>Y</tag1>
<tag2>sometext</tag2>
</a>
<a>
<tag1>N</tag1>
</a>
</parent>
我尝试了<choice>
代码,但似乎没有用... :(我得出的结论是此功能在XSD中不可用..
你能指导我至少实现这个的替代方案吗?顺便说一句,我使用的是Visual Studio 2005 ..
答案 0 :(得分:6)
您无法使用XSD验证此类内容。
XML架构不是设计用于检查“标签内”关系,例如“如果tag1的值为'Y',则必须存在tag2” - 只是无法完成,抱歉。
如果您需要检查这些条件,则必须查看Schematron才能执行此操作。
答案 1 :(得分:3)
众所周知,这是XML模式的一个回顾。但我很感激您尝试<choice>
标记的方法。如果您的条件是这样的话,它可能会成功:
<tag1>
并且首先显示,则不需要<tag2>
(并显示为第二个标记)<tag2>
并且首先显示,则不需要<tag1>
(并显示为第二个)代码是:
<xs:element name="parent">
<xs:complexType>
<xs:sequence>
<xs:element name="a" maxOccurs="unbounded">
<xs:complexType>
<xs:choice>
<xs:sequence>
<xs:element name="tag1" type="xs:boolean" />
<xs:element name="tag2" type="xs:string" minOccurs="0" />
</xs:sequence>
<xs:sequence>
<xs:element name="tag2" type="xs:string" />
<xs:element name="tag1" type="xs:boolean" minOccurs="0" />
</xs:sequence>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
答案 2 :(得分:1)
不幸的是,使用XSD无法解决此问题。原因是XSD只能用于定义XML-Files的结构(语法)。你想要做的是将语法耦合到一些语义属性(一些TAG必须有一定的内容来决定附近某些TAGS的语法)。
答案 3 :(得分:0)
它不可能与XSD ..但顺便说一句,如果要求有点舒适,你可以解决像婴儿程序员这样的事情,如她的例子所示..