2012-05-10 113 views
1

嗨,我試圖找到一種方式來開發擴展另一個模式驗證XML結構的模式。 比方說,我們有一個架構,它包含使用<xs:any>元素 一個擴展點,所以,我們有這樣一個模式:XS:任何包裝XML模式驗證

Source.xsd

<xs:complexType name="AType"> 
    <xs:complexContent> 
    <xs:sequence> 
     <xs:element name="B"/> 
     <xs:any/> 
    </xs:sequence> 
    </xs:complexContent> 
</xs:complexType> 

<xs:element name="A" type="AType"/> 

我可以再拍模式,它將通過引用原始模式驗證此XML?

Extended.xml

<A> 
    <B></B> 
    <C></C> 
</A> 

我想創建一個架構,將驗證整個A(與C)元素沒有我不得不重寫整個AType以納入C元素。我也不能使用redefine元素。

在此先感謝!

回答

0

首先,XS:任意具有的processContents屬性與值嚴格,不嚴,或跳過。嚴格的意思是「驗證內容;如果你找不到內容的模式定義,將其視爲無效」。 Lax的意思是「如果你能找到內容的模式定義,然後用它來驗證元素」。跳過表示不驗證。

有時候這樣就足夠了。

如果你想要更多的控制,那麼你可以驗證下獨立應用控制文檔的一部分。例如,您可以使用模式感知XSLT或XQuery輕鬆完成此任務。例如,在XSLT中,可以導航到要驗證的元素,然後使用xsl:copy-of select =「x」validation =「strict」來驗證以該元素爲根的子樹。

+0

感謝您的輸入!只要深入研究它就會更好地理解「任何」構造。根據我的理解,被驗證的是來自另一個模式的「新」附加元素/內容,是否有可能使用另一個模式驗證整個「較大」結構? – user1330885

+0

我不確定我已經理解了這個問題。驗證元素時,這意味着驗證以該元素爲根的子樹。 –

1

在我看來,使用當前的1.0規範(邁克爾的要求XSLT 2.0及以上),最好的辦法是你使用置換組的頭,而不是爲xs:任何通配符。版本1.0將爲您提供更廣泛的互操作性,以實現軟件堆棧的可用性。

不像XS:任何與替換組你需要一個基本類型來錨定它。我建議讓它成爲一個複雜的類型。它可以是一個空的complexType定義,因此它不會帶有任何「多餘」的行李。然後

驗證將僅僅是給解析器指向包含取代基代替的基之一的成員的模式。

更新:添加示例XSD來說明;你更新SubstitutionGroupExample.xsd:

<?xml version="1.0" encoding="utf-8" ?> 
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:complexType name="AType"> 
     <xs:sequence> 
      <xs:element name="B"/> 
      <xs:element ref="any" /> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:element name="A" type="AType"/> 
    <xs:complexType name="TAny" abstract="true"/> 
    <xs:element name="any" type="TAny" abstract="true"/> 
</xs:schema> 

Extended.xsd:

<?xml version="1.0" encoding="utf-8" ?> 
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd/1" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd/1" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:base="http://tempuri.org/XMLSchema.xsd"> 
    <xs:import namespace="http://tempuri.org/XMLSchema.xsd" schemaLocation="SubstitutionGroupExample.xsd"/> 
    <xs:element name="someAny" substitutionGroup="base:any"> 
     <xs:complexType> 
      <xs:complexContent> 
       <xs:extension base="base:TAny"> 
        <xs:sequence> 
         <xs:element name="new"/> 
        </xs:sequence> 
       </xs:extension> 
      </xs:complexContent> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

一個有效的XML(基於擴展。XSD):

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<!-- Sample XML generated by QTAssistant (http://www.paschidev.com) --> 
<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:ext="http://tempuri.org/XMLSchema.xsd/1"> 
    <B>anyType</B> 
    <ext:someAny> 
     <ext:new/> 
    </ext:someAny> 
</A> 
1

我覺得彼得魯杜米特是在暗示 - 和我們實際使用的東西 - 這就是:你定義

Base.xsd

<xs:complexType name="AType"> 
    <xs:complexContent> 
    <xs:sequence> 
     <xs:element name="B" type="BType"/> 
     <xs:group ref="ATypeExtra"/> 
    </xs:sequence> 
    </xs:complexContent> 
</xs:complexType> 

<xs:element name="A" type="AType"/> 

Simple.xsd

<xs:include schemaLocation="Base.xsd"/> 

<xs:group name="ATypeExtra"> 
    <xs:sequence> 
    </xs:sequence> 
</xs:group> 

Extended.xsd

<xs:include schemaLocation="Base.xsd"/> 

<xs:group name="ATypeExtra"> 
    <xs:sequence> 
    <xs:element name="C" type="CType"/> 
    </xs:sequence> 
</xs:group> 

,然後使用Simple.xsdExtended.xsd爲這取決於你想要哪一個定義的驗證。

在我們的例子中,我們有一個核心架構必須不會改變,但可以在不同的設備進行擴展的系統,所以我們所有的xxxExtra組分發Base.xsd相當於上述(和屬性組)引用,然後在每個安裝中以不同的方式進行定義。

+0

嗨,我已經更新了我的帖子,以包含我的意思是與substitutionGroups的例子。你添加的東西也是正確的。還有一種模式稱爲「dangling」,因爲對外部XSD的引用沒有通過schemaLocation明確編碼,而是由模式加載器在上下文中解析。 –

+0

啊謝謝 - 我誤解了你的答案。 – MiMo

+0

我喜歡懸掛類型,它是創建可變內容的最佳實踐!我的目標是我不碰base/source.xsd。感謝您的輸入! – user1330885