我有一個任務在我面前,我有一個XML文檔,我需要 以系統化的方式將其轉換爲另一個XML文檔 - 將標籤Foo 更改爲標籤欄,將所有Qux標籤更改爲Frob的name="frob"
屬性標籤, 等。我不知道如何使用XSLT,但我對自己說 - 嘿,如果我必須對基於樹的數據進行一系列轉換, 聽起來像Lisp擅長的東西!如何使用destructuring-bind將XML轉換爲特定的s表達式樹?
所以我有XML的一大塊 - 例如:
<Object>
<field name="id">100520</field>
<field name="type_id">77</field>
<field name="has_extras"></field>
<field name="author_id">7</field>
<field name="summary">To Sir Duke, with love</field>
</Object>
我啜那以xml-parse tag
並獲得:
(Object nil "\n "
(field
((name . "id"))
"100520")
"\n "
(field
((name . "type_id"))
"77")
"\n "
(field
((name . "has_extras")))
"\n "
(field
((name . "author_id"))
"7")
"\n "
(field
((name . "summary"))
"To Sir Duke, with love")
"\n ")
我無法搞清楚如何處理與讓它進入我想要的 形狀。我目前的嘗試很脆弱 - 在assoc
和 cxr
函數上很重。 CL的destructuring-bind
似乎是我想要的,但我 無法弄清楚如何應用它。我想上述結構 變成這樣:
(Object
(id "100520")
(type_id "77")
(has_extras "")
(author_id "7")
(summary "To Sir Duke, with love"))
- 是
destructuring-bind
實際上是工具,我需要什麼? - 如果是這樣,我該如何應用它來從一種形式的數據到另一種形式?
- 如果不是,是這個合適的工具嗎?
如果XSLT是一個選項,我會爲此任務認真推薦它。你可以用一個非常簡潔的轉換來實現你所描述的,然後去喝啤酒。爲了更直接地解決您的問題,我不認爲'destructuring-bind'或emacs lisp是您需要的工具。 – harpo
小提琴。我以前很怕那個。我並不擔心學習XSLT,而是在截止日期之前這樣做。我的想法是「我有我的Lisp工具,讓我們看看我能做些什麼。」 –
爲了跟進,我對emacs lisp沒有任何反應。我只是不認爲它是用於XML轉換的正確工具。出於這個原因,我只寫了一些代碼將'org'文檔的內部表示導出到XML中,以便我可以對它們執行轉換(其目標輸出是XHTML)。這是我的首選,但在你的情況下,除了你正在做的實際轉換之外,還需要雙向翻譯*,所以你可能會迷失在翻譯中,可以這麼說。 – harpo