문제

내가 원하는 결과를 결합의 세퍼 쿼리를 필터링에 xml 나무입니다.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><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)

후 실행하는 이러한 세 가지 쿼리가 남아 있을 것입니다 세 개의 시퀀스 카디널리티 일치하지 않; given_namesuffix 될 것입니다 길이 1 안 surname 될 것입니다 길이 2 개.이것은 불가능한 결합 구성 요소 각각의 이름입니다.나를 작성해야 하나의하는 쿼리를 수행합니다 이 이름을 연결하는 동안 순서 건설입니다.

내가 찾는 것에는 매우 희박에 대한 문서 clojure.contrib.zip-filter.xml 와는 방법을 알아낼 수 없습니다 내가 이렇게 할 수 있다(경우 또는 그것도 가능).불행하게도 나는 Clojure(및 Lisp)초보자!할 수 있는 사람을 지적할 수 있는 방법을 작성하는 쿼리를 연결합니다 세 개의 다른 임베디드 쿼리가?

도움이 되었습니까?

해결책

당신이 얻을 수 있는 모든 사람이 하위 트리에서 한 단계(xml>xmlzip:출판:참가자:person_name)그 이름을 얻는 부분을 그들이 존재하는 경우(xml1->personzip:성 텍스트)및 그들을 결합하여 원하는 결과 같이:

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

결과에서("성서""성 B,주어진 B,B 접미사")

다른 팁

내 생각 대체 솔루션

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

다음 각 과정 <person_name> 니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top