XML Schema:没有支持元素的AttributeGroup?重复属性?

时间:2011-05-26 13:00:04

标签: xsd

我的任务是编写一个xml文档的解析器,其支持架构是由人们创建的,比我更智能,更有经验。我不是xml专家,但是,据我所知,我相信有其架构中缺少一些注意事项。

这是我给出的架构的简化版本:

<?xml version="1.0"?>
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
        <xsd:attributeGroup name="Group1">
            <xsd:attribute name="attrib1" type="xsd:NMTOKENS"/>
            <xsd:attribute name="attrib2" type="xsd:NMTOKENS"/>
        </xsd:attributeGroup>
</xsd:schema>

在我回到我的客户并批评他们的架构设计之前,我真的很感激集体stackoverflow智能来确认或否认以下内容:

  1. 架构中的某种元素应使用attributeGroup。仅让一个attributeGroup独立于模式中是没有意义的。 (除非此模式旨在导入另一个模式)
  2. attributeGroup中的属性只能在有效xml文档的单个元素中出现一次。例如:

    <?xml version="1.0"?>
    <element1 attrib1="first second third" attrib1="first second third"/>
    

    无效,因为有'attrib1'重复,对吗?

    • 我被告知我可能会收到重复属性的文件。我想告诉我的客户,架构需要反映这种可能性(如果可能的话......)。有没有办法定义一个可以多次出现的属性?我知道'maxOccurs'属性,但我不认为它对属性定义有效。
  3. 提前感谢您的意见。

1 个答案:

答案 0 :(得分:1)

  

应该使用attributeGroup   模式中的某种元素。   只有一个没有意义   attributeGroup独自站在一个   架构。

嗯,这取决于它是否有意义。在XML中,属性类似于“附加到元素的额外信息”。因此,在实例文档中,如果没有“托管”它的元素,则不能存在属性。要在实例文档中具有属性,需要1)存在具有此属性的元素2)该属性以某种方式在模式中定义或引用。如果架构中没有任何元素被定义(允许)使用某个属性,则该属性不能出现在实例文档中。

然后,再次允许定义未使用的属性,这不是错误。在某些情况下,这可能是合理的,例如,为了简化未来计划的功能的采用,或允许将模式导入或包含到另一个可以利用这些属性的模式中。

  

attributeGroup中的属性   只能在有效期内发生一次   xml文档。例如:

     

<?xml version="1.0"?> <element1 attrib1="first second third" attrib1="first second third"/>

     

无效,因为有一个   复制'attrib1',对吗?

您的代码示例很明确:XML中不允许这样做。作为stated in the XML recommendation:“属性名称不得在同一个开始标记或空元素标记中出现多次。”然后,您在代码示例上面写的声明并不完全正确。有效的XML文档中可能会出现多次相同的属性。它只需要出现在不同的元素上。在一个元素上复制属性不允许。但是,您可以复制元素,使它们都具有相同的属性。

不允许:

<element1 attrib1="first second third" attrib1="first second third"/>

允许:

<element1 attrib1="first second third"/>
<element1 attrib1="first second third"/>

作为一个极端情况,重复的属性名称适用于属性的扩展名称

<element ns1:attrib="value" ns2:attrib="value"/>
如果前缀ns1ns2都解析为相同的名称空间URI,则不允许