XSD:如何根据某些标签的值验证XML文件?

5 xml schema xsd

我试图验证这个XML文件......如果

  1. <tag1>是"Y"然后<tag2>必须出现

  2. 如果<tag1>是"N"则<tag2>不得出现..

    <parent>
      <a>
        <tag1>Y</tag1>
        <tag2>sometext</tag2>
      </a>
      <a>
        <tag1>N</tag1>
      </a>
    </parent>
    
    Run Code Online (Sandbox Code Playgroud)

我试过<choice>标签,但似乎没有工作.. :(我得出结论,这个功能在XSD中不可用..

你能指导我至少实现这个的替代方案吗?顺便说一句,我使用的是Visual Studio 2005 ..

mar*_*c_s 6

您无法使用XSD验证此类内容.

XML模式不是设计的,并不是为了检查"标签内"关系,例如,如果tag1的值为'Y',则必须存在"tag2" - 对不起,这是不可能的.

如果你需要检查这些条件,你必须看看Schematron这样做.

  • 我对schematron有点了解......听起来很有意思......但是为它开发的工具不多......甚至视觉工作室也不支持它...... (2认同)

Inf*_*nd' 3

众所周知,这是 XML 模式的一个便利之处。但我很欣赏你尝试该<choice>标签的方法。如果您的条件是这样的,那么它可能会成功:

  1. 如果<tag1>是必需的并且首先出现,则<tag2>不是必需的(并且显示为第二个标签)
  2. 如果<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>
Run Code Online (Sandbox Code Playgroud)