我正在尝试在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>
我是否需要在文档中的某处指定命名空间,还是可以在架构中获取它?
答案 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