2014-08-29 26 views
2

鑑於以下兩個模式假唯一粒子屬性(UPA)

(根)

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:someNs="first" 
      xmlns:someOtherNs="second" 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      elementFormDefault="unqualified" 
      attributeFormDefault="unqualified" 
      version="1.0" 
      targetNamespace="first"> 
    <xsd:import namespace="second" schemaLocation="./child.xsd" /> 
    <xsd:element name="employee" type="someNs:fullpersoninfo" /> 

    <xsd:complexType name="personinfo"> 
    <xsd:sequence> 
     <xsd:element name="firstname" type="xsd:string" /> 
     <xsd:element name="lastname" type="xsd:string" /> 
    </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="fullpersoninfo"> 
    <xsd:complexContent> 
     <xsd:extension base="someNs:personinfo"> 
     <xsd:sequence> 
      <xsd:element name="address" type="xsd:string" /> 
      <xsd:element name="city" type="xsd:string" /> 
      <xsd:element name="country" type="xsd:string" /> 
      <xsd:group ref="someOtherNs:Child" /> 
     </xsd:sequence> 
     </xsd:extension> 
    </xsd:complexContent> 
    </xsd:complexType> 
</xsd:schema> 

和(子)

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="someId-1" 
      targetNamespace="second" 
      elementFormDefault="qualified" 
      xmlns:someOtherNs="second" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns="second"> 

    <xs:element name="ChildElement" type="ChildElement" 
       nillable="false" /> 

    <xs:complexType name="ChildElement"> 
    <xs:sequence> 
     <xs:element name="firstname" type="xs:string" /> 
     <xs:element name="lastname" type="xs:string" /> 
    </xs:sequence> 
    </xs:complexType> 

    <xs:group name="Child"> 
    <xs:sequence> 
     <xs:element ref="ChildElement" minOccurs="0" maxOccurs="1" /> 
     <xs:any processContents="lax" minOccurs="0" 
       maxOccurs="unbounded" 
       namespace="##other" /> 
    </xs:sequence> 
    </xs:group> 

</xs:schema> 

一個唯一粒子屬性不應該是存在的孩子使用elementFormDefault="qualified",根用戶使用elementFormDefault="unqualified"。但是,當通過Java的xjc運行時,不可能使用生成的類,因爲類上的註釋似乎不夠充分 - 至少看起來似乎。 UPA如何避免?

在考慮中的誤差如下:

org.xml.sax.SAXParseException; lineNumber:8; columnNumber:41; cos-nonambig:「second」:ChildElement和WC [## other:「first」](或其替代組中的元素)違反了「唯一粒子歸因」。在對這個模式進行驗證期間,將爲這兩個粒子創建模糊性。

+1

對於哪個聲明是否收到UPA錯誤?請將確切的錯誤消息粘貼到您的問題中。謝謝。 – kjhughes 2014-08-29 12:55:34

回答

3

引用的錯誤消息表明模式處理器正在將<xs:any namespace="##other" .../>解釋爲允許任何不在命名空間first中的元素。也就是說,它將組參考視爲一個簡單的宏擴展,然後在根模式文檔的上下文中創建模型組組件(其中##other將引用除目標命名空間first以外的任何名稱空間),而不是在子模式文檔的上下文中創建它們(其中##other將引用除目標名稱空間second以外的任何名稱空間)。

的情況也許可以做出section 3.10.2 of the XSD 1.0 spec要求##other在child.xsd上下文被解釋:當namespace="##other",所述命名空間{}約束屬性的通配符部件上的值被描述爲「一對not和·<schema>父元素信息項的targetNamespace [屬性]的實際值·否則·缺失·「 - 對於child.xsd中的xs:any元素,targetNamespace屬性的值爲second,而不是first

一種情況可能是另一種方式:規範也明確指出,在組件級別上對命名模型組的引用是不可見的,本地元素聲明的範圍由模型的位置決定 - 組參考,而不是模型組定義的位置等等。在這種情況下,對於XSD規範來說,##other不應該具有「除first之外的任何名稱空間」的解釋,這似乎是非理性的。總的來說,我傾向於第一種解釋,但我非常懷疑可以說服你的工具創造者改變他們對規範的解釋:擴展命名模型組的規則也是如此令人困惑,並且涉及太多的手勢,容易說服任何人他們的解釋是錯誤的。

[哎呀。以下所謂的「解決方法」根本不是解決方法:它只是另一種更清晰的方式來激發您的處理器目前正在展示的行爲。對於那個很抱歉。]

一個解決方法:添加一個名爲模型組申報到根模式文檔,並指的是一個,而不是一個在child.xsd。所以加這根模式文檔:

<xs:group name="Child"> 
    <xs:sequence> 
    <xs:element ref="someOtherNs:ChildElement" 
       minOccurs="0" 
       maxOccurs="1" /> 
    <xs:any processContents="lax" 
      minOccurs="0" 
      maxOccurs="unbounded" 
      namespace="##other" /> 
    </xs:sequence> 
</xs:group> 

,並切換到

<xsd:group ref="someNs:Child" /> 

[結束的非工作 '處理方法' 從

<xsd:group ref="someOtherNs:Child" /> 

參考。現在,讓我們再試一次。]

一種方法來解決你的問題,如果你真的想你的工具來解釋在fullpersoninfo類型的通配符作爲允許任何元素不是在second命名空間,將是移動式fullpersoninfo進入second命名空間。爲了保持address等在first命名空間,定義模型組與那些在first命名空間:

<xsd:complexType name="fullpersoninfo"> 
    <xsd:complexContent> 
    <xsd:extension base="someNs:personinfo"> 
     <xsd:sequence> 
     <xsd:group ref="someNs:additional-person-info"/> 
     <xsd:group ref="someOtherNs:Child" /> 
     </xsd:sequence> 
    </xsd:extension> 
    </xsd:complexContent> 
</xsd:complexType> 

的報關參考fullpersoninfoemployee

<xs:group name="additional-person-info"> 
    <xs:sequence> 
    <xs:element ref="address" ... /> 
    ... 

second命名空間聲明fullpersoninfo按照常規方式:

<xsd:element name="employee" type="someOtherNs:fullpersoninfo" /> 

一種不同的方法被調用,如果你決定,你真的不希望這樣的元素是有效的:

<employee xmlns="first" xmlns:x="second"> 
    <firstname>Andrea</firstname> 
    <lastname>Doria</lastname> 
    <address/> 
    <city/> 
    <country/> 
    <firstname>Andrew</firstname> 
    <lastname>Carnegie</lastname> 
</employee> 

,可能會決定你真正喜歡它,如果通配符在first命名空間匹配任何不在 - 但在這種情況下,{second}ChildElement與通配符匹配,並且根本不需要在內容模型中提及它。

你可能會決定你希望它匹配的是在架構的當前版本不聲明任何東西 - 但對於這一點,你需要在你的工具XSD 1.1的意識。如果你有1.1的意識,你所擁有的內容模型不會被拒絕(儘管它仍然可能有一個令你感到驚訝的解釋)。

+0

C. M. Sperberg-McQueen,非常詳細的解釋。然而,正如我所看到的 - 我避免這種情況的唯一方法是使用XSD 1.1。事情是,我幾乎與現有的模式綁定在一起,因爲我已經提出了另一個我將遵循的標準 - EPCIS標準1.0.1(http://www.gs1.org/) gsmp/kc/epcglobal/epcis/epcis_1_0_1-standard-20070921.pdf) - 第9.1節。 就我所見 - 所提出的模式反映了擴展標準時需要的內容。然而,它似乎更像是一個模具問題(XJC是罪人) – jkiddo 2014-09-01 07:24:58