1

我知道我在定义标题方面做得不好,不知道如何表达我的问题。让我试着在这里解释一下。

我有XML这样的:

<School>
 <Teacher>
  <Student>
    <Name>Todd</Name>
    <Phone>
     <Number>7324567890</Number>
     <PrefPhone>1</PrefPhone>
    </Phone>
    <Phone>
     <Number>98765467890</Number>
     <PrefPhone>0</PrefPhone>
    </Phone>
    <Phone>
     <Number>77765467890</Number>
     <PrefPhone>0</PrefPhone>
    </Phone>
  </Student>
 </Teacher>
</School>

现在我的问题是:如何定义只有一个人<Phone>设置的模式限制?<Student><PrefPhone>true

4

2 回答 2

2

如果您使用的是 XML Schema 1.1,则可以通过 XPath 2.0指定共现约束。即这样的东西(未经测试):

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           version="1.1">
  <xs:element name="Student">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Name"/>
        <xs:element name="Phone" maxOccurs="unbounded" type="PhoneType"/>
      </xs:sequence>
      <xs:assert test="count('./Phone/PrefPhone[. = 1]') le 1"/>
    </xs:complexType>
  </xs:element>
</xs:schema>

如果您使用的是 XML Schema 1.0,则无法表达此类约束。但是,您可能会定义一个不同的PreferedPhone元素,以便每个元素只有一个Student作为解决方法:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           version="1.0">
  <xs:element name="Student">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Name"/>
        <xs:element name="PreferedPhone" maxOccurs="1" type="PhoneType"/>
        <xs:element name="Phone" maxOccurs="unbounded" type="PhoneType"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
于 2013-09-27T17:04:00.217 回答
1

确保只有一个(或最多一个)首选电话的最简单方法是为电话号码制作两个不同的元素:恰好(或最多)一个首选电话号码,以及任意数量的其他电话号码。这两个元素可以具有相同的类型,因为它们都是电话号码。

一个更简单的解决方案是说首选号码是文档实例中给出的第一个电话号码。

于 2013-09-30T01:14:14.507 回答