2012-11-23 33 views
1

我的XML(簡化的)是這樣的:如何防止在XSD架構中自引用外鍵值?

<Actions> 
    <Action Id="1"> 
    </Action> 
    <Action Id="2"> 
     <DoSomething> 
      <ActionRef ActionId="1" /> <!-- valid --> 
     </DoSomething> 
    </Action> 
</Actions> 

ActionId屬性值引用Action元件的Id屬性值。我已經在XSD中設置了外鍵約束,並且它可以正常工作。

我想阻止自參考值在洋場,就像這樣:

<Actions> 
    <Action Id="1"> 
    </Action> 
    <Action Id="2"> 
     <DoSomething> 
      <ActionRef ActionId="2" /> <!-- invalid --> 
     </DoSomething> 
    </Action> 
</Actions> 

當然,這可以很容易地處理該XML的應用程序中完成的,我會求助於如果我要求的是不可能的,但我更願意通過驗證過程自動完成。

我嘗試將[not(@ActionId = ../@Id)]添加到外鍵選擇器XPath查詢中,但在該上下文中無效(我也不確定它是否正確)。除此之外,我不知道還有什麼可以嘗試,並且看起來好像互聯網上的許多人甚至在他們的XSD中建立了外鍵關係,更不用說阻止這種情況了(我在這個確切的主題上沒有發現任何東西)。

回答

1

它無法完成 - XSD約束的選擇器語法非常有限。其他的選擇可能包括Schematron,假設你的運行時可以訪問XSLT處理器,這應該是合理的集成。如果您決定添加更多獨立於處理XML的應用程序的代碼的驗證規則,那麼付出的努力可能會得到回報。

+0

嗯...所以你覺得我是那種正確的軌道。由於XML文檔實際上不是用戶可編輯的,違反此約束的可能性很低,所以我只是在代碼中實現它。我不打算爲此使用XSLT或第三方任何東西,但感謝您的建議。我打算讓這個問題公開幾天,看看其他人是否有想法。 –

+0

如果你發現一些時間,看看[這篇文章](http://stackoverflow.com/questions/12803048/about-using-xsunique-on-xsitype-in​​-a-sequence/12803969#12803969)我'至少讓你知道關於什麼的想法。 –