XSD:检查具有特定值的元素是否存在

时间:2015-11-03 15:06:03

标签: xml xsd

我有来自XMPP核心的xml:

 <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
   <mechanism>X-OAUTH2</mechanism>
   <mechanism>X-GOOGLE-TOKEN</mechanism>
   <mechanism>PLAIN</mechanism>
 </mechanisms

我想检查它是否包含一个元素PLAIN(可能是其他元素,但需要PLAIN)。我试图用限制来做,但我无法做出正确的规则。我的尝试:

<xs:schema
       xmlns:xs='http://www.w3.org/2001/XMLSchema'
       targetNamespace='urn:ietf:params:xml:ns:xmpp-sasl'
       xmlns='urn:ietf:params:xml:ns:xmpp-sasl'
       elementFormDefault='qualified'>
  <xs:element name='mechanisms'>
    <xs:complexType>
      <xs:all>
        <xs:element ref='mechanism' minOccurs='1' maxOccurs='1'/>
      </xs:all>
    </xs:complexType>
  </xs:element>
  <xs:element name="mechanism">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:pattern value="PLAIN" />
    </xs:restriction>
  </xs:simpleType>
  </xs:element>
</xs:schema>

有人能帮助我吗?

1 个答案:

答案 0 :(得分:1)

这取决于您可以访问的XSD版本; XSD 1.1可以开箱即用,而单独的XSD 1.0无法完成这项任务。

以下是针对您的案例的XSD 1.1架构示例:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:ietf:params:xml:ns:xmpp-sasl" xmlns="urn:ietf:params:xml:ns:xmpp-sasl" xmlns:tns="urn:ietf:params:xml:ns:xmpp-sasl" elementFormDefault="qualified">
    <xs:element name="mechanisms">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="mechanism" minOccurs="1" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:assert test="tns:mechanism[. eq 'PLAIN']" />
        </xs:complexType>
    </xs:element>
    <xs:element name="mechanism">
        <xs:simpleType>
            <xs:restriction base="xs:string"/>
        </xs:simpleType>
    </xs:element>
</xs:schema>

如果机制的值已知,并且您希望显式验证它们,那么此外,您可以使用枚举:

    <xs:element name="mechanism">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value="X-OAUTH2"/>
                <xs:enumeration value="X-GOOGLE-TOKEN"/>
                <xs:enumeration value="PLAIN"/>                 
            </xs:restriction>
        </xs:simpleType>
    </xs:element>