我有具有以下結構的XML文件(多個「實體」節點):XML節點模板 - 我應該使用XSLT嗎?
<!-- entities.xml -->
<root>
<entity template="foo-template" kind="foo" name="bar">
<groups>
<group id="1">
<definition id="1" name="foobar" />
</group>
</groups>
</entity>
</root>
許多entity
節點具有相似的屬性和子節點。我希望允許用戶在單獨的文件中創建entity
模板。引用該模板將進行如下:
<entity template="foo-template" kind="foo" ... />
從「富模板」每個屬性和子節點應該被複制到entity
,除了那些已經存在(即允許覆蓋模板)。
我對XSLT不是很熟悉。它是完成這項任務的正確工具嗎,還是我最好沒有它來實施?
我正在使用C++和RapidXml,但可以使用其他XML庫。
編輯:例如。
模板文件:
<!-- templates.xml -->
<templates>
<entity template="foo-template" name="n/a" model="baz">
<groups>
<group id="1">
<definition id="1" name="def1" />
<definition id="2" name="def2" />
</group>
<group id="2">
<definition id="1" name="def3" />
<definition id="2" name="def4" />
</group>
</groups>
</entity>
</templates>
輸出文件:
<!-- output.xml -->
<root>
<entity kind="foo" name="bar" model="baz">
<groups>
<group id="1">
<definition id="1" name="foobar" />
</group>
<group id="2">
<definition id="1" name="def3" />
<definition id="2" name="def4" />
</group>
</groups>
</entity>
</root>
所以輸出包含第1組從 「entities.xml」 和組2從 「templates.xml」。無需將group
節點合併爲相同的ID。
我已經提供了一個答案,它將處理實體模板上的屬性,但重新閱讀我看到您也希望允許模板中的子元素的問題。在元素的情況下,「除了那些已經存在的」的標準是什麼?你可以編輯這個問題來包含一些關於什麼會被認爲是重複的,什麼不會(理想情況下,輸入,模板和相應的預期輸出的一些具體例子)的細節。 – 2013-03-05 14:20:15
感謝您的詳細解答!我已經添加了一個例子,希望這有助於更好地理解我的問題。 – kshahar 2013-03-05 14:55:34
好的,我編輯了我的答案來處理這個問題。 – 2013-03-05 15:18:31