如何在XML Schema中创建一个允许任何HTML元素作为其子元素的元素?

时间:2009-05-31 16:37:30

标签: html xml namespaces xsd

我正在尝试在XML模式中创建一个元素,这样只有标准(X)HTML元素可以用作子元素。我试过的是这个:

<xs:element name="description">
    <xs:complexType>
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:any namespace="http://www.w3.org/1999/xhtml" />
        </xs:sequence>
    </xs:complexType>
</xs:element>

当然,这不起作用,因为以下XML没有明确指定命名空间:

<description>
    <p>this is a test</p>
    <p>this is a <b>bold</b> test</p>
    <h1>Those were the tests</h1>
</description>

我是否需要在文档中的某处指定命名空间,还是可以在架构中获取它?

3 个答案:

答案 0 :(得分:2)

我认为你需要禁用内容处理:

  <xs:any namespace="http://www.w3.org/1999/xhtml" processContents="skip"/>

请参阅XML Schema规范中的section 5.5(特别是示例)

答案 1 :(得分:1)

您的架构看起来不错。请注意,xs:any / @ processContents的默认值是strict,这意味着您的XHTML元素也将被验证,因此您还需要一个XHTML模式并从模式中导入它。您可以在xs:any中使用processContents =“lax”来指定仅在存在这些元素的模式时才应用验证。

您的问题出在您应该为XHTML元素指定命名空间的实例中。您可以将XHTML名称空间声明为每个元素的默认名称空间,例如

<p xmlns="http://www.w3.org/1999/xhtml">this is a test</p>

或者你可以声明它绑定到前缀,例如h,然后使用该前缀来限定你的XHTML元素:

<description xmlns:h="http://www.w3.org/1999/xhtml">
  <h:p>this is a test</h:p>
  <h:p>this is a <b>bold</b> test</h:p>
  <h:h1>Those were the tests</h:h1>
</description>

DTD不支持名称空间,并且namepsace声明只是属性,因此可以在元素上声明固定的xmlns属性,以便将其自动放入特定的名称空间中。 XML Schema是名称空间感知的,您不能将名称空间声明作为固定属性。

答案 2 :(得分:0)

我认为你真的需要view this page