我想在xml树上组合三个zip-filter查询的结果.我正在解析的
XML看起来像这样:
@H_403_14@
您可以一步获取所有人物子树(xml-> xmlzip:publication:contributors:person_name)然后获取名称部分(如果它们存在(xml1-> personzip:surname文本))并将它们组合到您想要的结果中所以:
<someroot> <publication> <contributors> <person_name> <surname>Surname A</surname> </person_name> <person_name> <given_name>Given B</given_name> <surname>Surname B</surname> <suffix>Suffix B</suffix> </person_name> </contributors> </publication> </someroot>
从这个例子中你可以看到< given_name>和<后缀>是可选的 – 只有< surname>是必须的.这就是我的问题所在 – 如果我运行三个单独的查询,我得到的响应将彼此不同:
(xml-> xml :publication :contributors :person_name :given_name text) (xml-> xml :publication :contributors :person_name :surname text) (xml-> xml :publication :contributors :person_name :suffix text)
运行这三个查询后,我将留下三个基数不匹配的序列; given_name和suffix的长度为1,而姓氏的长度为2.这使得我无法组合每个名称的组件.我需要编写一个查询,在序列构造期间执行此名称连接.
我正在查看clojure.contrib.zip-filter.xml的非常稀疏的文档,并且无法弄清楚我是如何做到的(或者甚至可能).不幸的是,我是一个Clojure(和Lisp)的新手!任何人都可以指出我如何编写一个将连接其他三个嵌入式查询的查询?
(use 'clojure.contrib.zip-filter.xml) (defn format-name [surname given suffix] (str surname (if given (str "," given)) (if suffix (str "," suffix)))) (defn get-names [xz] (map (juxt #(xml1-> % :surname text) #(xml1-> % :given_name text) #(xml1-> % :suffix text)) (xml-> xz :publication :contributors :person_name))) (let [x (clojure.zip/xml-zip (clojure.xml/parse "foo.xml"))] (map (partial apply format-name) (get-names x)))
结果(“姓氏A”“姓氏B,给定B,后缀B”)