2011-02-23 42 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

相關問題