我有来自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>
有人能帮助我吗?
答案 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>