如何组合Clojure中xml树上zip筛选器查询的结果?

如何组合Clojure中xml树上zip筛选器查询的结果?,xml,clojure,clojure-contrib,xml-parsing,Xml,Clojure,Clojure Contrib,Xml Parsing,我想在xml树上组合三个zip筛选器查询的结果。我正在解析的XML如下所示: <someroot> <publication> <contributors> <person_name> <surname>Surname A</surname> </person_name> <person_name> <given_n

我想在xml树上组合三个zip筛选器查询的结果。我正在解析的XML如下所示:

<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>
在运行这三个查询之后,我将得到三个基数不匹配的序列<代码>姓名和后缀的长度为1,
姓氏的长度为2。这使得我无法组合每个名称的组件。我需要编写一个查询,在序列构造期间执行此名称连接


我正在查看关于
clojure.contrib.zip filter.xml
的非常稀疏的文档,不知道如何才能做到这一点(或者这是否可能)。不幸的是,我是一个Clojure(和Lisp)新手!有人能指出我如何编写一个将其他三个嵌入式查询连接起来的查询吗?

我想另一种解决方案是

(xml-> xml :publication :contributors :person_name)

然后在以后处理每个

您可以在一个步骤中获得所有的person子树(xml->xmlzip:publication:contributors:person\u name),然后获得名称部分(xml1->personzip:names text),并将它们组合到您想要的结果中,如下图所示:

(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”)

检查最近的SO问题:
(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)))