我需要解决以下问题。
//伪算法
//伪结束
它似乎是序列和选择的组合,但两个指标都有一个特征,不允许我想要的行为。
样品: elm4 elm1 elm2 elm1 elm3 elm3 elm3 elm4
请在我疯了之前拯救我:)
克里斯
答案 0 :(得分:3)
如果您的n
值不是太大而且您感到绝望,那么您可以创建一个内容模型来解释每个可能的组合,但这会以指数方式变得复杂。
最佳解决方案是使用支持XML Schema 1.1的工具(例如Xerces或Saxon),这样可以放宽对all
组出现值的限制。来自规范的section G.1.3:
- 醇>
本规范1.0版所施加的一些限制 所有团体都放松了:
一个。现在允许使用通配符 基团。
湾maxOccurs的值现在可能是 全部颗粒大于1 组。与a匹配的元素 特殊的粒子不一定是 在输入中相邻。
℃。所有群体现在都可以延长 向他们添加更多成员。
如果不这样做,一般的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架构中的minOccurs
和maxOccurs
属性。这将允许您设置特定元素中允许的元素数。 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) > 0) and (count(//elm1) < 3)">an error message</assert>
</rule>
</pattern>