2009-06-08 62 views
7

我想擴展一個XML架構來改變一個元素下一個孩子可以發生的次數。我可以重新定義一個XSD架構來更改某個類型的子項的maxOccurs屬性嗎?

在原始模式,則父類型被定義爲這樣:

<xsd:complexType name="CrimeLineBusiness_Type"> 
    <xsd:complexContent> 
     <xsd:extension base="PCLINEBUSINESS"> 
      <xsd:sequence> 
       <xsd:element ref="CrimeSchedule" minOccurs="0"/> 
       <xsd:element ref="CrimeMoneyAndSecurities" minOccurs="0"/> 
      </xsd:sequence> 
     </xsd:extension> 
    </xsd:complexContent> 
</xsd:complexType> 

我想使它所以無論CrimeScheduleCrimeMoneyAndSecurities被重複元素。我想這可能工作(內部xsd:redefine):

<xsd:complexType name="CrimeLineBusiness_Type"> 
     <xsd:complexContent> 
      <xsd:extension base="CrimeLineBusiness_Type"> 
       <xsd:sequence> 
        <xsd:element ref="CrimeMoneyAndSecurities" minOccurs="0" maxOccurs="unbounded"/> 
        <xsd:element ref="CrimeSchedule" minOccurs="0" maxOccurs="unbounded"/> 
       </xsd:sequence> 
      </xsd:extension> 
     </xsd:complexContent> 
    </xsd:complexType> 

然而,然後我得到了以下錯誤:

cos-nonambig: CrimeSchedule and CrimeSchedule (or elements from their substitution group) violate "Unique Particle Attribution". During validation against this schema, ambiguity would be created for those two particles.

這是有道理的,因爲這些孩子們在原來的架構確實定義。那麼,我該如何完成我需要做的事情呢?

謝謝!

回答

12

當您進行擴展時,新類型的內容模型是基本內容模型的序列,以及您在新類型中添加的內容模型。例如,在你的情況爲重新定義CrimeLineBusiness_Type類型的內容模型是

<xsd:sequence> 
    <xsd:sequence> 
    <xsd:element ref="CrimeSchedule" minOccurs="0"/> 
    <xsd:element ref="CrimeMoneyAndSecurities" minOccurs="0"/> 
    </xsd:sequence> 
    <xsd:sequence> 
    <xsd:element ref="CrimeMoneyAndSecurities" minOccurs="0" maxOccurs="unbounded"/> 
    <xsd:element ref="CrimeSchedule" minOccurs="0" maxOccurs="unbounded"/> 
    </xsd:sequence> 
</xsd:sequence> 

什麼,你可以嘗試達到你想要的是這種類型的雙重新定義。首先,您通過限制重新定義它,刪除可選的CrimeSchedule和CrimeMoneyAndSecurities元素,然後再通過擴展再次添加具有所需出現次數的元素。請參見下面的完整工作示例:

text.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

    <xsd:element name="test" type="CrimeLineBusiness_Type"/> 

    <xsd:complexType name="PCLINEBUSINESS"/> 
    <xsd:element name="CrimeSchedule"/> 
    <xsd:element name="CrimeMoneyAndSecurities"/> 

    <xsd:complexType name="CrimeLineBusiness_Type"> 
    <xsd:complexContent> 
     <xsd:extension base="PCLINEBUSINESS"> 
     <xsd:sequence> 
      <xsd:element ref="CrimeSchedule" minOccurs="0"/> 
      <xsd:element ref="CrimeMoneyAndSecurities" minOccurs="0"/> 
     </xsd:sequence> 
     </xsd:extension> 
    </xsd:complexContent> 
    </xsd:complexType> 

</xsd:schema> 

redef1.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:redefine schemaLocation="test.xsd"> 

    <xs:complexType name="CrimeLineBusiness_Type"> 
     <xs:complexContent> 
     <xs:restriction base="CrimeLineBusiness_Type"> 
      <xs:sequence/> 
     </xs:restriction> 
     </xs:complexContent> 
    </xs:complexType> 
    </xs:redefine> 
</xs:schema> 

redef2.xsd

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:redefine schemaLocation="redef1.xsd"> 
    <xs:complexType name="CrimeLineBusiness_Type"> 
     <xs:complexContent> 
     <xs:extension base="CrimeLineBusiness_Type"> 
      <xs:sequence> 
      <xs:element maxOccurs="unbounded" minOccurs="0" ref="CrimeSchedule"/> 
      <xs:element maxOccurs="unbounded" minOccurs="0" ref="CrimeMoneyAndSecurities"/> 
      </xs:sequence> 
     </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
    </xs:redefine> 
</xs:schema> 

一個有效的XML實例的test.xml

<?xml version="1.0" encoding="UTF-8"?> 
<test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="redef2.xsd"> 

    <CrimeSchedule></CrimeSchedule> 
    <CrimeSchedule></CrimeSchedule> 
    <CrimeMoneyAndSecurities></CrimeMoneyAndSecurities> 
    <CrimeMoneyAndSecurities></CrimeMoneyAndSecurities> 

</test> 

Regards, George

+1

很好的解釋和解決方案喬治!在看到關於XSD被投票並被提問者接受的幾個不正確答案後,我開始對SO失去信心。 – 13ren 2009-06-10 05:11:47

相關問題