将来自一个模式的HTML和XML组合在一起,所有模式都嵌套在另一个模式的元素中

时间:2009-12-06 17:54:18

标签: xsd

过去几年来,我一直在努力学习XML Schema。我对基础知识有很好的处理,但还有一件事我不知道:

我希望能够创建类似于以下内容的XML文档:

  <itemList xmlns="http://mydomain.com/namespaceA">
     <item>
        <html xmlns="http://www.w3.org/1999/xhtml"
              xmlns:nsB="http://mydomain.com/namespaceB">
           <body>
              <p>Any HTML code here but I want to be able to mark up
              <nsB:myBTag><strong>some</strong> of the text</nsB:myBTag>
              with tags from namespaceB even if those tags are nested within
              standard HTML tags and even if there are then more HTML tags 
              nested within my namespaceB tags.</p>
           </body>
        </html>
     </item>
  </itemList>

请注意,在<html>元素内部,xhtml命名空间是默认命名空间。这是因为我希望文档作者能够使用标准的HTML编辑器,然后只需在他们需要的地方插入特殊的namespaceB标记。在任何一个实例文档中,将有比命名空间B标记更多的XHTML标记。

所以,从我到目前为止暂时学到的内容来看,我认为我的两个模式需要看起来像这样:

namespaceA

  <?xml version="1.0" encoding="UTF-8"?>
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
             xmlns:nsA="http://mydomain.com/namespaceA"
             targetNamespace="http://mydomain.com/namespaceA">
      <xs:element name="itemList">
          <xs:complexType>
              <xs:sequence>
                  <xs:element name="item" maxOccurs="unbounded" minOccurs="1">
                      <xs:complexType>
                          <xs:any namespace="http://www.w3.org/1999/xhtml"
                                  minOccurs="1" maxOccurs="1"
                                  processContents="strict">
                      </xs:complexType>
                  </xs:element>
              </xs:sequence>
          </xs:complexType>
      </xs:element>
  </xs:schema>

(我认为我需要为<item>标记中的内容模型声明的唯一命名空间是XHTML命名空间,因为实例文档中的<html>标记声明了namespaceB命名空间,但我是绝不是积极的。)

namespaceB

  <?xml version="1.0" encoding="UTF-8"?>
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
             xmlns:nsB="http://mydomain.com/namespaceB"
             targetNamespace="http://mydomain.com/namespaceB">
      <xs:element name="myBTag">
          <!--  I am clueless here -->
          <!-- I have no idea how to make sure that additional HTML tags
           can go in here without screwing everything up -->
      </xs:element>
  </xs:schema>

最大的问题是:我是否需要做任何事情来确保XHTML和namespaceB标记可以自由混合,或者只是<xs:any>标记操作的一部分和部分?

当然,我的模式和文档将比这复杂得多。我简化了它们以便于讨论。提前感谢您提供的任何帮助。如果我能克服这个障碍,我可以创建一个非常强大的教育内容系统,帮助教育全世界免费。

1 个答案:

答案 0 :(得分:0)

根据XS spec<xs:any>元素可以具有namespace属性,该属性可以具有值##any - 这意味着文档中的相应元素可以具有任何命名空间。

缺少namespace属性具有相同的效果 - 因此您可以省略它。即“重大问题”的答案是:

  • 我是否需要做任何事情以确保XHTML和namespaceB标签可以自由混合? 不,你没有

  • 或者这只是标签操作的一部分和部分? 是的,它是

免责声明:我没有测试过这个,只读过上面的规范。如果我是你,我会尝试使用上面的简化XSD验证一些示例XML文档,使用流行的XSD验证器来确定它验证的条件。