2011-02-23 41 views
4

我需要解决以下问题。是否可以将元素限制为“选择”块中的最大值?

//伪码算法

  • 你有四个要素:elm1,elm2,elm3,elm4
  • elm1发生0-2次
  • elm2发生0-1次
  • elm3出现0 -n次
  • elm4发生0-n次
  • 可以以任何方式对它们进行排序,但发生的次数限于其给定数量。

//伪结束

好像序列和选择的组合,但两个指标都有一个特点,就是不允许我我所期望的行为。

样本: elm4 elm1 elm2 elm1 elm3 elm3 elm3 elm4

请救我之前,我会得到疯了:)

克里斯

+1

你可以在你的xsd schema中定义它并根据你的xml验证它。 – CarneyCode 2011-02-23 10:44:32

+1

它看起来像你的需求_可以以任何方式订购_和_occur限于它们的给定数量_是相互排斥的。 – Filburt 2011-02-24 14:58:31

+0

是的,正确,filburt。那可能吗? – ChrisBenyamin 2011-02-25 18:27:33

回答

3

如果您n值不会太大,你绝望,你可以使占了每一个可能的组合内容模型,但成倍增长。

最好的解决方案是使用支持XML Schema 1的工具。1(如XercesSaxon),放宽对all组发生值的限制。从规范的section G.1.3

  1. 几个通过对全组本规范 的1.0版本造成的限制已经放宽:

    一个。现在允许在所有 组中使用通配符。

    b。在所有 组中,maxOccurs的值现在可能大于1,粒子数为 。与输入中相邻的特定粒子的元素不必是 。

    c。所有团体现在都可以通过 加入更多成员。

如果做不到这一点,一般XML模式1.0溶液是指定在模式松弛模型(在元件出现没有限制),然后执行你所关心的在另一个层的约束,这可能是自定义代码或XSLT,例如。

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> 
+0

这只是解决手头问题的一半。 – Filburt 2011-02-25 22:23:41

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> 
+0

使用代码:是否可以用另一个complexType替换,这可以被定义为更灵活?我的想法是:放一个complexType(出现0或1),但它可以有不同的子元素。 – ChrisBenyamin 2011-02-27 19:37:56

+0

@ChrisBenyamin不,这是不可能的:''的唯一[允许的子元素](http://msdn.microsoft.com/en-us/library/ms256182.aspx)是''和''。 – Filburt 2011-02-28 08:11:40

+0

这些都是很好的方法,但没有什么能以任何方式解决我的问题。嗯..也许我必须认真考虑这个问题。 – ChrisBenyamin 2011-03-03 20:51:10

0

这是不可能在XML的架构。您可以结合使用可以选择采用类似的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> 

+1

这不会帮助我,因为schematron在xsl中使用。 – ChrisBenyamin 2011-02-26 14:00:50

相关问题