استعلام XPath على مجموعة العقدة تعمل مثل SQL حيث في
سؤال
عينة من وثيقة XML:
<xml>
<list>
<item refid="1" />
<item refid="3" />
</list>
<catalogue>
<model id="1"><details /></model>
<model id="2"><details /></model>
<model id="3"><details /></model>
</catalogue>
</xml>
أرغب في الاستعلام عن شيء مثل // Model [id = (// item/ @refid)] للحصول على كل "نموذج" له معرف مرجع في "قائمة"
المحلول
أرغب في الاستعلام عن شيء مثل // Model [id = (// item/ @refid)] للحصول على كل "نموذج" له معرف مرجع في "قائمة"
المشكلة الرئيسية هنا هي افتقارك إلى الثقة وليس في الواقع تشغيل محرك XPath لتقييم التعبيرات التي توصلت إليها.
إذا قمت بتقييم تعبير XPath الذي اقترحته:
//model[ @id = (//item/@refid) ]
سترى أنه يختار بالضبط (اثنان) model
عناصر ، من id
تتم الإشارة إلى السمات من قبل refid
سمات item
العناصر التي هي أطفال list
.
@Jörn-Horstmann في إجابته أوضح بالفعل سبب حصولك على هذه النتائج.
ملاحظة بسيطة تتمثل في تجنب استخدام //
اختصار. يتسبب في مسح المستند بأكمله وغير فعال للغاية. في هذه الحالة ، أود استخدام المكافئ ولكن ربما أسرع لتقييم تعبير XPath:
/*/catalogue/model[@id = /*/list/item/@refid]
نصائح أخرى
يجب أن يعيد تعبير XPath الخاص بك بالفعل ما تريده بالضبط. نقلا عن http://www.w3.org/tr/xpath/#booleans, ، الفقرة الخامسة:
إذا كان أحد الكائنات التي يجب مقارنتها عبارة عن مجموعة عقدة والآخر عبارة من العقدة والسلسلة الأخرى صحيحة