2010-09-03 33 views
0

我需要在一個大的XML文件,以應用約束,就像這樣:受限制的XPath(約束)允許什麼?

<library> 
    <book> 
     <bookAuthor ID="1" nameAlias="PeerBR jr"/> 
    </book> 
    <book> 
     <bookAuthor ID="1"/> 
    </book> 
</library> 
<authorCatalogue> 
    <author ID="1" name="PeerBr"/> 
</authorCatalogue> 

我需要每個BOOKAUTHOR的ID來引用一個有效的作者。

我發現「受限制的XPath」非常笨拙,但可能會忽略某些東西。我是否有權定義約束是這樣的:

<xs:keyref name="bookAuthor" refer="author"> 
    <xs:selector xpath="library/book/bookauthor"/> 
    <xs:field xpath="@ID"/> 
</xs:keyref>   
<xs:key name="author"> 
    <xs:selector xpath="authorCatalogue/author"/> 
    <xs:field xpath="@ID"/> 
</xs:key> 

它的工作原理,但我的文件實際上更多的是嵌套的,所以它變得非常混亂。另外我必須爲「library/book/CoAuthor」寫一個新的約束。有沒有更優雅的,我可以做的?我不能縮寫選擇器嗎?

我可以限制約束的應用嗎(「bookauthor [@nameAlias]」)?

在此先感謝您的幫助。

+0

這個問題不是關於一般的XPath表達式。來自:http://www.w3.org/TR/xmlschema-1/#cIdentity-constraint_Definitions'{selector}指定一個受限制的XPath([XPath])表達式,相對於正在聲明的元素的實例.'。所以,我編輯了你的標籤。另外,從http://www.w3.org/TR/xmlschema-1/#coss-identity-constraint看起來,您可以使用'|'節點集合並運算符。所以,也許你可以使用'library/book/bookauthor |圖書館/書/ CoAuthor',但我不是XSchema專家... – 2010-09-03 18:41:47

+0

@Alejandro:是的,你是完全正確的,我已經閱讀了架構並按照你的建議嘗試了聯盟運營商。謝謝。 – PeerBr 2010-09-03 19:06:44

回答

4

在O'Reilly的「XML Schema」中找到答案。它是確定有:

  • 與子元素的相對路徑
  • 命名空間
  • 所有元素(「*」)
  • 任何子元素(「.//bookauthor」在我的情況會做招)

這是不正常包括任何幻想,比如:

  • 消減NT元素
  • 測試(「[@nameAlias]」,所以沒辦法申請約束只用nameAlias屬性節點)
  • 絕對路徑

希望這可以幫助別人絆倒的問題後。

相關問題