Xml XSD:若元素有一个特定的值,那个么另一个值应该是可选的

Xml XSD:若元素有一个特定的值,那个么另一个值应该是可选的,xml,xsd,xsd-validation,Xml,Xsd,Xsd Validation,我有一个XML文档,它类似于: <?xml version="1.0" encoding="UTF-8"?> <html2filename xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/mapper.xsd"> <htmlFile filename="N5670A"> <variant>1

我有一个XML文档,它类似于:

<?xml version="1.0" encoding="UTF-8"?>
<html2filename xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../xsd/mapper.xsd">
    <htmlFile filename="N5670A">
        <variant>1</variant>
        <groups>
            <group>
                <name>Removing thermostat</name>
            </group>
            <someOtherElements>asdasd</someOtherElements>
        </groups>
    </htmlFile>
</html2filename>

1.
拆卸恒温器
asdasd
现在元素“groups”->“group”->“name”->应该有一个约束:如果“variant”的值为3,那么它应该是可选的。如果没有,则应要求

XSD能处理吗?如果是,如何执行?

XSD 1.1
xs:assert
可以实现这样的值敏感约束:

            <xs:assert test="(variant = 3) or groups/group/name"/>

这里是在一个完整的XSD上下文中验证您提供的XML:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning"
  vc:minVersion="1.1">
  <xs:element  name="html2filename">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="htmlFile">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="variant"/>
              <xs:element name="groups">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="group" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="name" minOccurs="0"/>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="someOtherElements"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="filename"/>
            <xs:assert test="(variant = 3) or groups/group/name"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
     </xs:complexType>    
  </xs:element>
</xs:schema>


您应该使用XSD 1.1回滚说明:您已经更改了XML文档,添加了与描述不同的XSD,并且没有包括(更不用说修改)我提供的xs:assert。我提供的XSD对于您的原始问题是正确的,并且我确认了对您原始XML文档的验证。如果您需要进一步帮助,请发布新问题。谢谢。非常感谢你的帮助。请看我的最新答案。添加
后,我的验证器说:无法加载XML模式。我已回滚您的更改。请看我在对问题的评论中的解释。确保您使用的是支持XSD1.1的验证解析器。如果你的问题比这更严重,请用最小的例子来说明你的困难。谢谢。正如我已经发布的那样,我在使用您的代码后收到一个错误:“S4s elt无效内容。1:AnonType#u HTMLFileHTMLVideoMapper”的内容无效。元素“assert”无效、错位或出现得太频繁。”在线验证,使用eclipse和Notepad如果您收到带有此答案中列出的XSD 1.1代码的错误消息,那么您的XML处理器不支持XSD1.1。试试Xerces2-J2.11、Oxygen、XMLSpy、Saxon EE等等。你不能只是猜测,尤其是在学习XSD 1.1时,因为你不知道错误是你的还是处理器根本不支持XSD 1.1。