1

我想执行 xml 模式验证。这是我的 xml 文件的摘录。

......

<parameter name="ip">true</parameter>
<parameter name="address">calo</parameter>
<parameter name="telephone" locked="false">optional</parameter>
<parameter name="tools">cutter</parameter>

…………

当我生成 xsd 文件时,它看起来像这样。

  <xs:complexType name="parameterType" mixed="true">
    <xs:sequence>
      <xs:element type="propertyType" name="property" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="name" use="optional"/>
    <xs:attribute type="xs:string" name="locked" use="optional"/>
  </xs:complexType>
  <xs:complexType name="listenerType" mixed="true">
    <xs:sequence>
      <xs:element type="propertyType" name="property" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="class" use="optional"/>
    <xs:attribute type="xs:string" name="name" use="optional"/>
    <xs:attribute type="xs:string" name="locked" use="optional"/>
  </xs:complexType>

我的问题是我想通过施加限制来验证每个标签属性值。(对于 'ip' 检查值 (true) 是否包含类似 '$' 的字符,对于地址值 'calo' 包含相同的字符 ($)。

我使用过类似的东西,但它只验证属性的名称。(例如: ip - ok , i$p - 错误)

 <xs:attribute name="name" use="optional">
        <xs:simpleType>
           <xs:restriction base="xs:string">
           <xs:pattern value="[^$]*"/>
         </xs:restriction>
       </xs:simpleType>
  </xs:attribute>

我想要的是验证值而不是属性的名称。(不是名称 'address' 而是值 - 'calo' 包含 '$' )有没有办法做到这一点?

4

1 回答 1

0

只要parameterType包含子元素(propertyType在您的情况下),您就不能。

如果parameterType不包含任何子元素,您可以像这样声明其内容的限制:

<xs:simpleType name="propertyString">
  <xs:restriction base="xs:string">
    <xs:pattern value="[^$]*"/>    
  </xs:restriction>
</xs:simpleType>

<xs:complexType name="propertyType">
  <xs:simpleContent>
    <xs:extension base="propertyString">
      <xs:attribute type="xs:string" name="name" use="optional"/>
      <xs:attribute type="xs:string" name="locked" use="optional"/>
    </xs:extension>
  </xs:simpleContent>
</xs:complexType>

请注意,根据属性之一的值,不可能有不同的限制。

于 2013-11-12T15:05:35.403 回答