如何为具有相同名称但具有不同内容的元素编写有效的xsd

时间:2011-03-22 08:37:58

标签: xml xsd

我们在编写正确的(有效的)xsd时遇到了一些问题: - xsd应在http://www.w3.org/2001/03/webdata/xsv上验证 - 应该可以将模式添加到sql server架构集合(CREATE XML SCHEMA COLLECTION test AS'[xsd here]' - 我们需要在xsd

中指定'title'属性值

这是(一种极为简化的)XML结构:      

1)这是我们的第一个版本(显然无效):你不能有2个名称为'input'的元素是不同的

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xsd:element name="test">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="input">
                    <xsd:complexType>
                        <xsd:attribute name="title" fixed="Pretty title" use="required"/>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element name="input">
                    <xsd:complexType>
                        <xsd:attribute name="title" fixed="Different title" use="required"/>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

2)第二次尝试:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:element name="test" type="Test"/>
<xsd:complexType name="input1">
    <xsd:attribute name="title" fixed="Pretty title" use="required"/>
</xsd:complexType>
<xsd:complexType name="input2">
    <xsd:attribute name="title" fixed="Different title" use="required"/>
</xsd:complexType>
<xsd:complexType name="Test">
    <xsd:sequence>
        <xsd:element name="input" type="input1"/>
        <xsd:element name="input" type="input2"/>
    </xsd:sequence>
</xsd:complexType>

  • w3.org提供与以前相同的错误消息:非正式重新声明{无}:输入
  • xmlspy告诉我们这是一个有效的xsd
  • sql server抛出错误:“Test”类型的内容模型包含两个具有相同名称“input”和不同类型,可空性或值约束的元素。

如果有人可以就此给我们一些见解,那就太好了。

马努。

ps:实际上,我们的XML结构比示例更复杂。我们正在构建一个Web表单生成器。 这是另一个(仍然很简单)的例子:

<?xml version="1.0" encoding="UTF-8"?>
<ZForm title="main title" attachment="attachment1" type="NM08">
<Part title="part title">
    <SubTitle code="I.1)" title="title 1"/>
    <ShortText title="short text title 1"/>
    <SubTitle code="I.2)" title="title 2" subtitle="subtitle 1"/>
    <SelectList type="select type" title="select title"/>
    <ShortText title="short text title 2"/>
    <MultiSelectList type="multiType2" title="multi select title"/>     
    <RadioButtonList type="yesNo" title="lala"/>
    <SubTitle code="I.3)" title="some other title" subtitle="what?"/>
    <MultiSelectList type="multiType2" title=""/>
</Part>
<Part title="second part title">
    <Repeater add="add a new repeater item" remove="remove last repeating part">
        <RepeatingPart>
            <SubTitle code="II.1)" title="tiiiiiitle"/>
            <ShortText/>
        </RepeatingPart>
    </Repeater>
</Part>
</ZForm>

1 个答案:

答案 0 :(得分:2)

XSD规范定义了一个约束“Element Declarations Consistent”,其效果是当两个兄弟元素具有相同的名称时,它们也必须具有相同的类型。

众所周知,XMLSpy没有强制执行规范中一些更尴尬的规则。我不知道是不是因为他们没有编写代码,或者他们是否觉得他们的版本是一个改进,但是使用一种符合方法的工具检查你的模式总是一个好主意更严格(Xerces实际上比W3C MSV服务更强大。)