0

这是否是声明不能有子元素或其他内容的 XML 元素 Foo 的正确方法?

<xs:element name="Foo" type="xs:string" fixed="" nillable="true" />

XML 文档中此元素的有效示例是:

<Foo></Foo>

<Foo/>

其他任何内容都是无效的,例如:

<Foo>stuff</Foo>

以下是有效的,尽管不是必需的,这将是很好的

<Foo>
</Foo>
4

3 回答 3

1

我将几个选项组合到一个模式中,并尝试使用它来验证一些测试元素。

资料来源: http ://www.w3schools.com/schema/schema_complex_empty.asp

http://www.herongyang.com/XML-Schema/complexType-Empty-Element-Declaration.html

架构:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded">
        <xs:element name="foo">
          <xs:complexType></xs:complexType>
        </xs:element>
        <xs:element name="y1">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:length value="0" />
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="y2">
          <xs:complexType>
            <xs:complexContent>
              <xs:restriction base="xs:anyType" />
            </xs:complexContent>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

测试用例:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="NewXMLSchema.xsd">
 <!--  These six are all valid -->
  <foo />
  <y1 />
  <y2 />
  <foo></foo>
  <y1></y1>
  <y2></y2>
  <!-- These three are all invalid! -->
  <foo>
  </foo>
  <y1>
  </y1>
  <y2>
  </y2>
  <!--  These are invalid too. -->
  <foo>invalid</foo>
  <y1>invalid</y1>
  <y2>invalid</y2>
</root>

看起来这三个元素声明中的任何一个都可以满足您的要求,除了额外的空行功能。

我不会包含 type="xs:string"、fixed="" 或 nillable="true",因为这些在语义上都与空标签不同。空标签实际上没有类型(如字符串),因为它是空的。它也没有空字符串的固定值,因为这与空字符串不同。可空元素在语义上与空标记不同,因为它在语义上等同于不存在的标记(来源:Michael Kay 的 XSLT 2.0 和 XSLT 2.0 程序员参考,第 182 页。)。像这样的空标签<br/>并不意味着在这种情况下不存在换行符。这意味着存在换行符,但没有内容或属性。

于 2012-04-04T21:39:47.673 回答
0

定义强制空内容的类型有两种方法:一种是使用简单的 xs:string 类型,使用枚举或模式方面(或使用固定)将其限制为零长度;另一种是使用定义为(例如)空元素序列的复杂类型。出于验证目的,它们之间没有太多选择。但是如果您有兴趣使用您的模式做更高级的事情,比如定义类型层次结构和替换组,或者将模式映射到 Java 对象模型,那么您选择的可能会有所不同。

于 2012-04-04T21:27:30.383 回答
-1
<xs:element name="Foo">
  <xs:complexType>
    <xs:attribute name="Bar" type="xs:positiveInteger"/>
  </xs:complexType>
</xs:element>

您可以省略属性标签以使其完全为空...

于 2012-04-04T19:08:12.617 回答