2012-11-21 126 views
4

繼此tutorial我將我的733行模式重構爲16個獨立的文件或子模式,每個文件或子模式都有其自己的命名空間。現在頂級模式只有77行。計劃是使用這些子模式構建其他頂級模式。使用XSLT自動生成XML模式

問題是,大多數頂級模式都非常相似,只是在一些低級別的細節上有所不同。例如,當一個頂級架構支持全部PaymentMethodType(參見tutorial)時,另一個頂級架構可能僅支持VISA和MasterCard。目前,我創建頂級模式的方法涉及相當多的重複。例如,我目前創建支持VISA和MasterCard的頂級架構的方法將涉及重複Main.xsdOrderType.xsd,但是定製CommonTypes.xsd並重新使用CustomerTypes.xsd。 (因爲我的實際模式更長,所涉及的重複次數更多。)

我覺得這種重複是不可接受的,主要是因爲它引入了維護挑戰,即我將不得不維護具有不同名稱的任意數量的相同子模式。

我想知道的是,如果有一種方法不通過某種類型的配置文件(XSLT或許?)自動生成模式,以避免重複子模式。

而且,是它所有的子模式來聲明相同的目標命名空間在此情況下(就像XML架構命名空間xs很好的做法,但定製子模式聲明不同的命名空間?

+0

我已經充分考慮了這種情況,但從來沒有設計出這樣的優雅方法。請關注此線程。 –

+0

在這種情況下,您可能還需要關注以下主題: http://www.oxygenxml.com/pipermail/oxygen-user/2012-November/004455.html – Olumide

回答

-1

我我不打算描述一種基於XSLT的方法,因爲我沒有意識到任何好的方法,並且因爲我在開發中看到你自己的搖擺:「某種類型(XSLT也許?)」

你想要什麼我已經在2004年嘗試過;我已經放棄了XSLT作爲處理XML模式重構的語言,因爲我認爲模式對象模型API(SOM/XSOM) - 專爲XSD設計的API分析和創建 - 更有效地利用我的時間(對於閱讀本文的XSLT專家,我已經限定了我的陳述)。

總有一種可能性,因爲你想要的實際上很簡單,因此可以採用滾動式自己的XSLT,否則在經濟上或智力上是可行的。爲您的問題分享更具體的參數可能有助於產生更好的答案。儘管如此,如果您正在考慮以專業的方式進行這項工作,即對您的輸入和輸出XSD的外觀做出最小假設,那麼您需要做一些工作。

我最終做的是爲XML Schema重構設計一個Domain Specific Language。它可作爲QTAssistant XSR模塊的一部分。 從圖形上看,這就是你的「733行模式到16個獨立的文件或子模式」在QTAssistant中的樣子。

enter image description here

它的重構功能,讓很多人都從單一來源組描述的東西。所有你需要做的就是配置你需要的「視圖」和任何需要的功能(例如,什麼在XSD文件中,自動拉入所需的依賴關係,更改目標命名空間,重構類型名稱,元素,替換基類型刪除不需要的粒子,引入順序包裝以改變基數等)。按鈕推送可以保證有效的XSD文件。它還帶有一個命令行界面,用於與自動構建系統集成。

如果有什麼,我會考慮看看一個API,如在。NET的Schema包,如果僅僅是爲了獲得在XSLT模板可以或許如何設計靈感......

0

你爲什麼要複製Main.xsdOrderType.xsd不是重用他們爲你做CustomerTypes.xsd的?如果它們字面上相同(如「重複」意味着),爲什麼不直接導入它們呢?我猜你可能會忽略一些問題...

此外,似乎有一個詞在「沒有通過生成架構」中缺失。

  1. 爲每個子模式使用不同的命名空間;另一種方法是「變色龍模式」。這就是子模式本身沒有名稱空間的地方,但是需要使用頂層模式的名稱空間。 Multi-Schema Project: Zero, One, or Many Namespaces?。但是,這種技術有點棘手,並不是所有的工具都支持它,所以一些suggest avoiding it。但對於你的情況,也許這是值得的......當然,閱讀這些鏈接會給你如何處理你的情況的想法。

  2. 您可以redefine另一個模式的特定部分(該模式的其餘部分保持不變)。看看example below the defintion。這聽起來像是,正是解決您的問題。重新定義的部分可以是低級的,由模式的其他部分(或其他導入的模式)使用。但是,與上面(1)一樣,這是規範中棘手的部分,有些工具可能不支持。

因此......希望您的工具能夠實現規範的這些功能(以及任何需要使用它們的人的工具)。您可以使用上面鏈接中的示例對其進行測試(我確認它適用於xmllint)。

如果不是這樣,那麼使用XSLT(或其他XML /文本處理工具)組裝子模式的想法就可行。如果您希望獲得有關XSLT的特定幫助,我建議您包含您開始的模式樣本以及所需的結果模式。