سؤال

وأنا باستخدام الأكسجين XML إلى العمل مع ملف XML الذي يحتوي على مراجع إلى ملفات XML أخرى. يتم تخزين هذه الملفات XML أخرى في دليل فرعي من الدليل الذي يحتوي على ملف XML الرئيسي.

Downloads/
directory1/
  main.xml
  subdirectory1/
    other1.xml
    other2.xml

ويتم تخزين مواقع الملفات XML أخرى الارتباطات النسبية داخل الملف الرئيسي. بلدي الاستعلام يبدو وكأنه شيء هذا:

for $df in /clldata/DiscussionForums/DiscussionForum
    let $href := replace(data($df/@href),"\\","/")
    for $p in doc($href)
return $p

والمشكلة لقد واجهت هي أن الأوكسجين يستخدم المسار إلى ملف كسكيري كقاعدة لمسار نسبي، مما أدى الواضح في الملف لا العثور على أخطاء. كيف يمكنني الحصول على المسار إلى وثيقة XML داخل الاستعلام الخاص بي؟

والآن أنا فقط باستخدام CONCAT () لإلحاقها المسار الصحيح ولكن أريد أن تكون قابلة لإعادة الاستخدام بسهولة.

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

المحلول

وتحتاج إلى حل URI نسبة إلى URI وثيقة XML الرئيسية. في الحالة الخاصة بك، وربما كنت تريد أن تفعل شيئا مثل:

و let $href = resolve-uri($d/@href, base-uri($d))

وهنا، ($ د) وظيفة قاعدة أوري هو الحصول على URI المطلق المستند المصدر الذي يحتوي على عقدة DiscussionForum ذات الصلة، والعزم-اوري وحل URI قريب جديدة لهذا.

وهذا يعمل بالنسبة لي باستخدام SAXON على جيديت كسكيري المساعد. YMMV، أنا لم تستخدم الأكسجين XML.

نصائح أخرى

وأعتقد أن تعبير XPath التالية يجب تحديد كافة المستندات المرتبطة:

/clldata/DiscussionForums/DiscussionForum/@href/doc(resolve-uri(., base-uri(.))

وهكذا يجب أن تكون قادرة على النفاذ إلى أي عنصر أكس على كل الوثائق التي عثر عليها مثل هذا:

/clldata/DiscussionForums/DiscussionForum/@href/doc(resolve-uri(., base-uri(.))
/path/to/the/element/you/want/to/find/in/all/documents/@name

إذا كنت تفضل التعبير عن أسلوب FLOWR، ثم شيئا من هذا القبيل ينبغي أن نفعل ذلك:

for $doc in /clldata/DiscussionForums/DiscussionForum/@href/doc(resolve-uri(., base-uri(.))
where $doc/some/criteria='select'
return $doc/path/to/the/element/you/want/to/find/in/all/documents/@name
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top