8

xmlツリーで3つの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>

この例から、これはオプションで<given_name>あり、必須であることがわかります。ここに私の問題があります-3つの別々のクエリを実行すると、私が得る応答は互いにキルターから外れます:<suffix><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)

これらの3つのクエリを実行した後、カーディナリティが一致しない3つのシーケンスが残ります。長さは1、長さは2given_nameになります。これにより、各名前のコンポーネントを組み合わせることができなくなります。シーケンス構築中にこの名前の連結を実行する単一のクエリを作成する必要があります。suffixsurname

私はの非常にまばらなドキュメントを見ていますclojure.contrib.zip-filter.xmlが、これをどのように行うことができるか(またはそれが可能かどうか)を理解できません。残念ながら、私はClojure(およびLisp)の初心者です!他の3つの埋め込みクエリを連結するクエリを作成する方法を誰かが指摘できますか?

4

2 に答える 2

6

すべての人物サブツリーを1つのステップで取得し(xml-> xmlzip:publication:contributors:person_name)、名前部分が存在する場合はそれを取得し(xml1-> personzip:surname 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)))

結果は( "Surname A" "Surname B、Given B、Suffix B")

于 2010-01-14T05:00:52.577 に答える
2

別の解決策は

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

その後、それぞれを処理<person_name>します。

于 2010-01-13T17:09:02.617 に答える