1

我如何描述模式文件中的“内容”元素,以便知道孩子的顺序,但在“元数据”之后和“内容部分”之前可以放置任何元素?

基本上我想做下面例子中描述的事情。这,粗略地说,是行不通的。我会将 1 个或多个元素放置在当前位置。

<xs:element name="content">
    <xs:complexType>
      <xs:sequence> 
       <xs:element name="metadata" minOccurs="0" maxOccurs="unbounded"></<xs:element>
       <xs:any>
       <xs:element name="content-section" minOccurs="0" maxOccurs="unbounded">/<xs:element>  
       <xs:element name="content-footer" minOccurs="0" maxOccurs="unbounded">
   </<xs:element>    
 </xs:element>

XML:

  <content>
    <metadata></metadata>
    <h1>Not in schema</h1>
    <p>also not in schema</p>
    <content-section></content-section>
    <content-footer></content-footer>
  </content>
4

2 回答 2

1

使用AnywithprocessContents="skip"以您的方式工作..

我举了一个更好的例子:

<?xml version="1.0" encoding="utf-8"?>
<content>
  <metadata></metadata>
  <h1>Not in schema</h1>
  <p>also not in schema</p>
  <content-section></content-section>
  <content-footer>Do not validate this as well</content-footer>
</content>

以及相关的 XSD:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="content" type="content"/>
  <xs:complexType name="content">
    <xs:sequence>
      <xs:element name="metadata" type="xs:string"/>
      <xs:any processContents="skip" minOccurs="2" maxOccurs="2"/>
      <xs:element name="content-section"  type="xs:string"/>
      <xs:any processContents="skip" minOccurs="1" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>
于 2013-03-14T09:04:53.253 回答
0

您可能遇到的问题之一称为唯一粒子属性。这完全取决于any您想要的那些元素可能属于哪些名称空间。

最坏的情况是任何命名空间。因此,满足您的要求(与 InfantPro'Aravind' 不同,它通过在您希望它是可选的地方将内容部分规定为强制性的,并将您的任何元素的 maxOccurs 限制为任意数字来解决问题)这就是我们开始的地方(坏模式,违反 UPA)。首先,修复任何的 maxOccurs 以允许1 or more elements to be placed in the location

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="content">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="metadata" minOccurs="0" maxOccurs="unbounded"/>
                <xsd:any maxOccurs="unbounded"/>
                <xsd:element name="content-section" minOccurs="0" maxOccurs="unbounded"/>
                <xsd:element name="content-footer" minOccurs="0" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

错误是:

Error occurred while loading [how-can-i-describe-an-element-with-some-any-child-element-and-some-known.xsd], line 8 position 6.
Wildcard '##any' allows element 'metadata', and causes the content model to become ambiguous. A content model must be formed such that during validation of an element information item sequence, the particle contained directly, indirectly or implicitly therein with which to attempt to validate each item in the sequence in turn can be uniquely determined without examining the content or attributes of that item, and without any information about the items in the remainder of the sequence.

现在你需要解决这个问题。这些是您的选择:

1) 将任何名称空间限制为其他内容(例如##other):

<xsd:any maxOccurs="unbounded" namespace="##other"/>

如果你不能限制你的命名空间,这些是你的选择:

2)将内容包装any到另一个元素(称为扩展):

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="content">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="metadata" minOccurs="0" maxOccurs="unbounded"/>
                <xsd:element name="extension"/>
                <xsd:element name="content-section" minOccurs="0" maxOccurs="unbounded"/>
                <xsd:element name="content-footer" minOccurs="0" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

所有其他都涉及移动any底部的内容。

3)any在底部向右移动,并在其前面加上一个强制元素。

如果您希望这种类型是全局的并允许它不是最终的,那么您将进入其他模式。

于 2013-03-14T12:10:46.210 回答