كيف يمكنني الجمع بين النتائج من الاستفسارات الرمز البريدي تصفية على شجرة أكس في كلوجر؟

StackOverflow https://stackoverflow.com/questions/2057797

سؤال

وأريد أن الجمع بين نتائج ثلاثة الاستفسارات الرمز البريدي تصفية على شجرة أكس. و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)

وبعد تشغيل هذه الاستعلامات ثلاثة وسوف يكون تركت مع ثلاثة متواليات التي لا تتطابق cardinalities. سوف given_name وsuffix يكون طول 1 بينما surname سيكون طول 2. وهذا يجعل من المستحيل بالنسبة لي أن الجمع بين مكونات كل اسم. لست بحاجة لكتابة استعلام واحد من شأنها أن تؤدي هذا الاسم سلسلة أثناء عملية البناء التسلسل.

وأنا أبحث في وثائق ضئيلة جدا لclojure.contrib.zip-filter.xml ولا يمكن معرفة كيف يمكن القيام بذلك (أو إذا كان من الممكن حتى). للأسف أنا كلوجر (واللثغة) مبتدئ! نقطة أي شخص يمكن معرفة كيف يمكنني كتابة استعلام من شأنها أن سلسلة ثلاثة الاستفسارات جزءا لا يتجزأ من الأخرى؟

هل كانت مفيدة؟

المحلول

ويمكنك الحصول على كل الأشجار الفرعية شخص في خطوة واحدة (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)))

والنتائج في ( "اللقب A" "B اللقب، نظرا B، B لاحقة")

نصائح أخرى

وافترض حل بديل هو

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

ومن ثم معالجة كل <person_name> في وقت لاحق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top