XML模式多属性

XML模式多属性,xml,xsd,xml-validation,Xml,Xsd,Xml Validation,我试图创建一个必需的元素,它有不同的子元素。示例XMl文件如下所示: <datamodel> <info name="user"> <userRight>add user</userRight> </info> <info name="admin"> <role>manager</role> <

我试图创建一个必需的元素,它有不同的子元素。示例XMl文件如下所示:

<datamodel>
    <info name="user">
        <userRight>add user</userRight>
    </info>
    <info name="admin">
        <role>manager</role>
    </info>
</datamodel>
<xs:element name="info" type="xs:anyType">
    <xs:alternative test="@name='user'" type="userRightType"/>
    <xs:alternative test="@name='admin'" type="roleType"/>
</xs:element>

添加用户
经理
我目前有以下xml模式

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="datamodel">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="info" maxOccurs="unbounded" minOccurs="0" >
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:string" name="userRight" minOccurs="0"/>
              <xs:element type="xs:string" name="role" minOccurs="0"/>
            </xs:sequence>
            <xs:attribute type="xs:string" name="name" use="optional" fixed="user"/>
          </xs:complexType>
        </xs:element>
        <xs:element name="info" maxOccurs="unbounded" minOccurs="0">
          <xs:complexType>
            <xs:sequence>
              <xs:element type="xs:string" name="userRight" minOccurs="0"/>
              <xs:element type="xs:string" name="role" minOccurs="0"/>
            </xs:sequence>
            <xs:attribute type="xs:string" name="name" use="optional" fixed="admin"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>


然而,给定的XML模式将无法使用我所拥有的示例XML文件。如何修改模式以验证这样的XML?

使用XMLSchema1.1,通过该机制,您可以实现所需的功能。它看起来像这样:

<datamodel>
    <info name="user">
        <userRight>add user</userRight>
    </info>
    <info name="admin">
        <role>manager</role>
    </info>
</datamodel>
<xs:element name="info" type="xs:anyType">
    <xs:alternative test="@name='user'" type="userRightType"/>
    <xs:alternative test="@name='admin'" type="roleType"/>
</xs:element>


接下来,找到一个支持XMLSchema1.1的XML解析器。您没有提到您使用哪种语言,但我认为最新的Xerces2 Java支持它。

您可以使用XMLSchema 1.1实现您想要的功能。它看起来像这样:

<datamodel>
    <info name="user">
        <userRight>add user</userRight>
    </info>
    <info name="admin">
        <role>manager</role>
    </info>
</datamodel>
<xs:element name="info" type="xs:anyType">
    <xs:alternative test="@name='user'" type="userRightType"/>
    <xs:alternative test="@name='admin'" type="roleType"/>
</xs:element>


接下来,找到一个支持XMLSchema1.1的XML解析器。您没有提到您使用哪种语言,但我认为最新的Xerces2 Java支持它。

或者您可以使用RELAXNG而不是XML模式,Xerces、Saxon和大多数库也支持它,这使得指定此类内容非常容易,例如



或者,您可以使用RELAXNG而不是XML模式,Xerces、Saxon和大多数库也支持它,这使得指定这类内容非常容易,例如



因此,您正试图根据
name
属性中的值更改info下所需的节点?这是系统特定的XMl文件,我无法更改XMl内容。但是,应该验证该内容,这是使用名称属性值区分该内容的唯一方法。因此,您正在尝试根据
name
属性中的值更改信息下所需的节点?它是系统特定的XMl文件,我无法更改XMl内容。然而,该内容应该是有效的,并且是使用名称属性值来区分它的唯一方法。