如何使用属性限制 complexType 中的元素内容?

How to restrict element content inside a complexType with attributes?

我正在尝试在 XSD 的帮助下验证 XML。

这是我的示例 XML:

<Cells 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation= "ImportCellsXSD.xsd">
    <Cell spread="2" row="128" column="51">p</Cell>  
    <Cell spread="0" row="10" column="1">ea</Cell>        
    <Cell spread="0" row="8" column="2">d</Cell>                  
</Cells>

这是我的 XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema  elementFormDefault="qualified" attributeFormDefault="unqualified" 
             xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="Cells">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Cell" type="TCell" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>   

    <xs:complexType name="TCell">
        <xs:sequence>
            <xs:element name="Cell" type="TCellValidation" maxOccurs="unbounded"/>

        </xs:sequence>
        <xs:attribute name="spread" type="TSpread" use="required"/>
        <xs:attribute name="row" type="TRow" use="required"/>
        <xs:attribute name="column" type="TColumn" use="required"/>
    </xs:complexType>    

    <xs:simpleType name="TCellValidation">
        <xs:restriction base="xs:string">       
            <xs:pattern value="[A-Za-z0-9]+"/>
        </xs:restriction>
    </xs:simpleType>

</xs:schema>

TSpreadTColumnTRow 只是对 minInclusivemaxInclusive

的验证

当我尝试验证 xml 时,我在尝试读取 "p" 、 "ea" 和 "d"

时遇到此错误

cvc-complex-type.2.3: Element 'Cell' cannot have character [children], because the type's content type is element-only. [6] cvc-complex-type.2.4.b: The content of element 'Cell' is not complete. One of '{Cell}' is expected. [6]

如何定义cell的内容? (p, ea 和 d)

您的 XSD 要求 Cell 元素位于 Cell 元素内——可能不是您想要的,而且绝对不是您的 XML 所拥有的。

这是您的 XSD 解决方案以消除上述问题并验证您的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema  elementFormDefault="qualified" attributeFormDefault="unqualified" 
            xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="Cells">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Cell" type="TCell" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>   

  <xs:complexType name="TCell">
    <xs:simpleContent>
      <xs:extension base="TCellValidation">
        <xs:attribute name="spread" type="xs:string" use="required"/>
        <xs:attribute name="row" type="xs:string" use="required"/>
        <xs:attribute name="column" type="xs:string" use="required"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>    

  <xs:simpleType name="TCellValidation">
    <xs:restriction base="xs:string">       
      <xs:pattern value="[A-Za-z0-9]+"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

(TSpread, TColumnTRow 没有在你发布的 XSD 中定义,所以我把它们存根为 xs:string,但是原理保持不变。)