是否可以将元素限制在“选择”块中?

时间:2011-02-23 10:37:29

标签: xml xsd

我需要解决以下问题。

//伪算法

  • 你有四个元素:elm1,elm2,elm3,elm4
  • elm1发生0-2次
  • elm2发生0-1次
  • elm3发生0-n次
  • elm4发生0-n次
  • 他们可以以任何方式订购,但仅限于他们给定的数量。

//伪结束

它似乎是序列和选择的组合,但两个指标都有一个特征,不允许我想要的行为。

样品: elm4 elm1 elm2 elm1 elm3 elm3 elm3 elm4

请在我疯了之前拯救我:)

克里斯

4 个答案:

答案 0 :(得分:3)

如果您的n值不是太大而且您感到绝望,那么您可以创建一个内容模型来解释每个可能的组合,但这会以指数方式变得复杂。

最佳解决方案是使用支持XML Schema 1.1的工具(例如XercesSaxon),这样可以放宽对all组出现值的限制。来自规范的section G.1.3

  
      
  1. 本规范1.0版所施加的一些限制   所有团体都放松了:

         

    一个。现在允许使用通配符   基团。

         

    湾maxOccurs的值现在可能是   全部颗粒大于1   组。与a匹配的元素   特殊的粒子不一定是   在输入中相邻。

         

    ℃。所有群体现在都可以延长   向他们添加更多成员。

  2.   

如果不这样做,一般的XML Schema 1.0解决方案是在模式中指定一个宽松的模型(对元素出现没有限制),然后在另一个层(可能是自定义代码或XSLT)中强制执行您关心的约束。实例

答案 1 :(得分:1)

不,我不认为这是可能的。您的要求似乎相互排斥。你可以有:

每种类型的元素但不超过一种(或零)

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root">
        <xs:complexType>
            <xs:all>
                <xs:element name="elm1" minOccurs="0" maxOccurs="1" />
                <xs:element name="elm2" minOccurs="0" maxOccurs="1" />
                <xs:element name="elm3" minOccurs="0" maxOccurs="1"/>
                <xs:element name="elm4" minOccurs="0" maxOccurs="1"/>
            </xs:all>
        </xs:complexType>
    </xs:element>
</xs:schema>

<?xml version="1.0" ?>
<root>
    <elm4 />
    <elm1 />
    <elm3 />
</root>

固定顺序的元素,每个元素都有特定的出现次数

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="elm1" minOccurs="0" maxOccurs="2" />
                <xs:element name="elm2" minOccurs="0" maxOccurs="1" />
                <xs:element name="elm3" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element name="elm4" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

<?xml version="1.0"?>
<root>
    <elm1 />
    <elm1 />
    <elm2 />
    <elm4 />
    <elm4 />
    <elm4 />
    <elm4 />
</root>

答案 2 :(得分:0)

您可以始终使用XSD架构中的minOccursmaxOccurs属性。这将允许您设置特定元素中允许的元素数。 this tutorial

中的更多信息

如何在选择块中使用它的示例代表here,如下所示:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified" attributeFormDefault="unqualified">
   <xs:element name="document">
      <xs:complexType>
         <xs:choice minOccurs="1" maxOccurs="unbounded">
            <xs:element name="A" minOccurs="1" maxOccurs="1"/>
            <xs:element name="B" minOccurs="0" maxOccurs="3" />
            <xs:element name="C" minOccurs="0" maxOccurs="1"/>
         </xs:choice>
      </xs:complexType>
   </xs:element>
</xs:schema>

答案 3 :(得分:0)

在xml-schema中不可能。您可以选择与schematron类似的选项:

<schema xmlns="http://purl.oclc.org/dsdl/schematron">
<pattern>
    <title>Occurance rules</title>
    <rule context="elm1">
        <assert test="(count(//elm1) &gt; 0) and (count(//elm1) &lt; 3)">an error message</assert>
    </rule>
</pattern>