هل يمكن لـ XPath إرجاع العقد التي لها فرع X فقط؟
سؤال
هل من الممكن استخدام XPath لتحديد العقد التي تحتوي على عناصر فرعية معينة فقط؟على سبيل المثال، من ملف XML هذا، أريد فقط العناصر الموجودة في الحيوانات الأليفة التي لها فرع "bar".وبالتالي فإن مجموعة البيانات الناتجة ستحتوي على lizard
و pig
عناصر من هذا المثال:
<pets>
<cat>
<foo>don't care about this</foo>
</cat>
<dog>
<foo>not this one either</foo>
</dog>
<lizard>
<bar>lizard should be returned, because it has a child of bar</bar>
</lizard>
<pig>
<bar>return pig, too</bar>
</pig>
</pets>
هذا Xpath يعطيني جميع الحيوانات الأليفة: "/pets/*"
, ، لكنني أريد فقط الحيوانات الأليفة التي لها عقدة فرعية من الاسم 'bar'
.
المحلول
هنا هو في كل مجدها
/pets/*[bar]
إنجليزي:أعطني جميع أطفال pets
التي لديها طفل bar
نصائح أخرى
/pets/child::*[child::bar]
عذرا، لم أرى التعليقات على الرد السابق.
لكن في هذه الحالة أفضّل استخدام descendant::
المحور، الذي يتضمن كافة العناصر أسفل من المحدد:
/pets[descendant::bar]
فقط في حالة رغبتك في أن تكون أكثر تحديدًا بشأن الأطفال - يمكنك أيضًا استخدام المحددات عليهم.
مثال:
<pets>
<cat>
<foo>don't care about this</foo>
</cat>
<dog>
<foo>not this one either</foo>
</dog>
<lizard>
<bar att="baz">lizard should be returned, because it has a child of bar</bar>
</lizard>
<pig>
<bar>don't return pig - it has no att=bar </bar>
</pig>
</pets>
الآن، أنت تهتم فقط بالجميع pets
وجود أي طفل bar
الذي له سمة att
مع القيمة baz
.يمكنك استخدام تعبير xpath التالي:
//pets/*[descendant::bar[@att='baz']]
نتيجة
<lizard>
<bar att="baz">lizard should be returned, because it has a child of bar</bar>
</lizard>