كيفية تحديد جميع العقد الأوراق باستخدام تعبير XPath؟
-
30-09-2019 - |
سؤال
أعتقد أنه ممكن ولكن لم أستطع معرفة بناء الجملة. شيء من هذا القبيل:
xmlNode.SelectNodes("//*[count(child::*) <= 1]")
لكن هذا ليس صحيحا.
المحلول
يستخدم:
//node()[not(node())]
في حالة فقط عنصر العقد الورقية مطلوبة (وهذا يحتاج إلى توضيح-هل العناصر التي تعتبر الأطفال غير العناصرين يعتبرون العقد الورقية؟) ، ثم يختارها تعبير XPath التالي:
//*[not(*)]
كلا التعبيرات أعلاه ربما يكون أقصر التي تحدد العقد المطلوبة (إما أي عقدة أو عنصر-العقد الأوراق).
نصائح أخرى
أي عناصر بدون طفل عناصر
//*[not(child::*)]
لماذا أقل أو متساوٍ إلى 1 ؟
xmlNode.SelectNodes("//*[count(child::*) = 0]")
قم بإجراء الاختبارات وما إلى ذلك في هذا الموقع http://www.whitebeam.org/library/guide/technotes/xpathtestbed.rhtm
مفيد جدا ..
أقوم بإضافة إجابة XSLT هذه لأنه يبدو أن مباريات Google الأمامية تفتقر إلى مثل هذا الحل:
بعد صراع طويل مع استخراج CDATA مثل XML ، في النهاية ، عمل هذا التعبير بشكل أفضل بالنسبة لي:
<xsl:template match="*[not(child::*)]/text()">