2013-08-18 33 views
1

我想檢查一個屬性是否存在於另一個xml中,來自另一個xml中的xsd。
爲例我有此XSD如何驗證跨文檔引用?

<xs:schema version="1.0" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     elementFormDefault="qualified"> 
<xs:element name="models"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="model" maxOccurs="unbounded" minOccurs="1"> 
       <xs:complexType> 
        <xs:attribute name="name" type="xs:string" use="required"/> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:unique name="uniqueModelName"> 
     <xs:selector xpath="./model"/> 
     <xs:field xpath="@name"/> 
    </xs:unique> 
</xs:element> 

和我有另一個XSD

<xs:element name="language"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="word" maxOccurs="unbounded"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="value" maxOccurs="unbounded" minOccurs="1"> 
          <xs:complexType> 
           <xs:attribute name="lange" type="xs:string" use="required"/> 
          </xs:complexType> 
         </xs:element> 
        </xs:sequence> 
        <xs:attribute name="key" type="xs:string" use="required"/> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

,我想確保該屬性命名在第一XSD命名model元件name是存在在屬性key的元素value中的第二個xsd
換句話說,如果有屬性值名爲name在第一個xsd中沒有存在於第二個xsd中,必須發生錯誤。
XML例子:
XML爲第一XSD:

<model name="A"/> 
<model name="B"/> 

XML爲第二XSD:

<word key="A"> 
    <value lange="english">Add</value> 
    <value lange="frensh">ajouter</value> 
</word> 

它必須告訴有一個錯誤,因爲在具有第二XML沒有標籤word一個屬性B 這可能發生在xsd :)?
雖然這是一個正確的

<word key="A"> 
    <value lange="english">Add</value> 
    <value lange="frensh">ajouter</value> 
</word> 
<word key="B"> 
    <value lange="english">Add</value> 
    <value lange="frensh">ajouter</value> 
</word> 
+0

我有同樣的問題,PLZ幫助我們!!!! – Steve

回答

2

XSD驗證的設計是上下文無關,因此任何元件可以以隔離(隔離兩個從其祖先和兄弟姐妹和從其他文件)進行驗證。所以,不,您所考慮的那種跨文檔驗證在XSD中是不可能的。

您可以使用Schematron(基本上允許您編寫任意XPath表達式來約束您的文檔)進行描述,使用Service Modeling Language(用於啓用各種跨文檔驗證),或與任何圖靈完整編程語言。或者,當然,您可以使用設計過程來檢查外部XML文檔並從中構建適當的XSD類型(特別是列出所討論屬性的合法值),並使用生成的XSD驗證您的初始XML文檔。

+0

其實我找到了一種方法來做到這一點:),它是通過給這兩個xml提供相同的xsd,並在xsd中放置一個根標籤,然後放置一個選擇標籤,這些選擇是兩個xml的根源,唯一的編輯將是我添加了兩個xml的額外的根,現在我可以把限制到兩個xml – Tarek

+0

對不起。那麼我一定誤解了你的問題。 –

+0

@C。 M. Sperberg-McQueen:Schematron如何提供幫助? – reinierpost