XML Schema - 我可以使用unique枚举进行验证吗?

时间:2017-03-14 17:51:28

标签: xml xsd schema

我研究了很多主题,但仍需要一些帮助。

我需要验证一个必须包含5个元素的XML,每个元素都有一个特定的值。他们不能重复。

xml片段:    ...

<logger name="br.com.xxxx" additivity="false">
        <level value="info"/>
        <appender-ref ref="FILE-rolling"/>
    </logger>

    <logger name="br.com.web.aq" additivity="false">
        <level value="info"/>
        <appender-ref ref="FILE-rolling"/>
    </logger>

    <logger name="br.com.data.connector" additivity="false">
        <level value="info"/>
        <appender-ref ref="FILE-rolling"/>
    </logger>

    <!--FACES LOGGER-->
    <logger name="javax.faces" additivity="false">
        <level value="info"/>
        <appender-ref ref="FILE-rolling"/>
    </logger>

    <!--MYFACES LOGGER-->
    <logger name="org.apache.myfaces" additivity="false">
        <level value="info"/>
        <appender-ref ref="FILE-rolling"/>
    </logger>

到目前为止,我的xsd只是验证值列表,如下所示:

<xsd:element name="configuration">

<xsd:complexType>
  <xsd:sequence>
    <xsd:element minOccurs="3" maxOccurs="3" ref="property"/>
    <xsd:element minOccurs="1" maxOccurs="1" ref="appender"/>
    <xsd:element minOccurs="5" maxOccurs="5" name="logger">

    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="level"/>
        <xsd:element ref="appender-ref"/>
    </xsd:sequence>

    <xsd:attribute name="additivity" type="xsd:string" use="required" fixed="false"/>      

    <xsd:attribute name="name" use="required">  

        <xsd:simpleType>            
        <xsd:restriction base="xsd:token">
            <xsd:enumeration value="br.com.xxxx"/>  
            <xsd:enumeration value="br.com.web.aq"/>
            <xsd:enumeration value="br.com.connector"/>
            <xsd:enumeration value="javax.faces"/>
            <xsd:enumeration value="org.apache.myfaces"/>
        </xsd:restriction>
    </xsd:simpleType>
 </xsd:attribute>

</xsd:complexType>

<xsd:unique name="uniquity">
      <xsd:selector xpath="logger"/>
      <xsd:field xpath="@name"/>
</xsd:unique>

</xsd:element>

但就目前而言,XML可以拥有2个记录器&#39;同名。

*使用唯一约束更新了xsd。缺少一些可以使验证工作的东西。

1 个答案:

答案 0 :(得分:0)

是的,您可以结合使用xs:unique和xs:enumeration。只需在记录器元素的父元素的元素声明中添加xs:unique约束:

<xs:unique name="uniquity">
  <xs:selection xpath="logger"/>
  <xs:field xpath="@name"/>
</xs:unique>