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