使用XSD验证XML元素属性值

时间:2014-01-17 10:26:07

标签: xml xslt xml-parsing xsd

我有以下XML元素。 我需要验证参数属性是否仅包含以下XML元素中的Y或N

<Test Script="abc.sh" Parameter="Y"/>
               **OR**
<Test Script="abc.sh" Parameter="N"/>

我的XSD是:

    <xs:element name="Test" minOccurs="0">
        <xs:complexType>
            <xs:attribute name="Script" type="xs:string" use="required"/>
            <xs:attribute name="Parameter" type="xs:string" use="optional"/>                    
        </xs:complexType>
    </xs:element>

目前此XSD未验证参数是否持有 Y N

3 个答案:

答案 0 :(得分:4)

您需要定义attributesimpleType代表restriction,以强制属性值为定义的值集合的成员。

想象一下,你有以下xml:

<?xml version="1.0"?>
<Test Script="path/to/script" Parameter="Y" xmlns="http://www.example.org" />

您可以使用此xsd强制type属性的值为foobar

<?xml version="1.0"?>
<xsd:schema 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:tns="http://www.example.org"
  targetNamespace="http://www.example.org"
  elementFormDefault="qualified"
  attributeFormDefault="unqualified"
>
    <xsd:element name="Test">
      <xsd:complexType>
        <xsd:attribute name="Script" type="xsd:string" use="required"/>
        <!-- the following has no type attribute. It's type is 
             defined in the simpleType child -->
        <xsd:attribute name="Parameter" use="optional">
          <xsd:simpleType>
            <!-- define a set of xsd:strings
                 as possible values -->
            <xsd:restriction base="xsd:string">
              <xsd:enumeration value="Y"/>
              <xsd:enumeration value="N"/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:attribute>
      </xsd:complexType>
    </xsd:element>
</xsd:schema>

答案 1 :(得分:2)

你必须像这样定义你的参数属性

      <xs:simpleType name="yesno">
            <xs:restriction base="xs:string">
                <xs:enumeration value="Y" />
                <xs:enumeration value="N" />
            </xs:restriction>
      </xs:simpleType>



      <xs:attribute name="Parameter" type="xs:yesno" use="optional"/>

答案 2 :(得分:1)

试试这个:

<xs:element name="Test" maxOccurs="unbounded">
                <xs:complexType>
                            <xs:attribute name="Script">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:enumeration value="abc.sh">
                                        </xs:enumeration>
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:attribute>
                              <xs:attribute name="Parameter">
                                 <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:pattern value="Y|N" >
                                        </xs:pattern>
                                    </xs:restriction>
                                 </xs:simpleType>    
                              </xs:attribute>
                </xs:complexType>
</xs:element>