ตัวดำเนินการ XPath OR สำหรับโหนดที่ต่างกัน


144

ฉันจะทำอย่างไรกับ XPath:

//bookstore/book/title or //bookstore/city/zipcode/title

แค่//titleไม่ทำงานเพราะฉันยังมี//bookstore/magazine/title

ps ฉันเห็นมากหรือตัวอย่าง แต่ส่วนใหญ่มีคุณสมบัติหรือโครงสร้างโหนดเดียว


5
หรือรวมทั้งสองด้าน สิ่งที่คุณกำลังมองหาคือผู้ดำเนินการ XOR คุณกำลังทำให้การใช้ภาษาอังกฤษของคำหรือกับผู้ประกอบการตรรกะ
Zoran Pavlovic

10
ในกรณีนี้มันไม่สร้างความแตกต่างไม่ว่าคุณจะใช้หรือหรือxorเพราะมันเป็นไปไม่ได้ที่จะจับคู่ทั้งสองด้าน
Dan Hulme

คำตอบ:


219

titleโหนดทั้งหมดที่มีzipcodeหรือbookโหนดเป็นพาเรนต์:

รุ่น 1:

//title[parent::zipcode|parent::book]

รุ่น 2:

//bookstore/book/title|//bookstore/city/zipcode/title

5
"|" ไม่ใช่ "ตัวดำเนินการ OR" ใน XPath จริง ๆ จะอนุญาตให้คุณสร้างโหนดที่ประกอบด้วยจาก substrees ของต้นไม้ XML ทั้งหมด "// book | // cd" หมายถึงในบรรดาโหนดชายน์และลูกหลานของโหนดรูทจะค้นหาทุกชื่อที่ชื่อว่า 'book' จากนั้นค้นหาทั้งหมดที่ชื่อ 'cd' หากในการสืบทอดรูทโหนดมีเพียงโหนดหนังสือชุดโหนดของคุณจะมีโหนดหนังสือเท่านั้น หากในการสืบทอดรูทโหนดมีเพียงโหนดซีดีชุดโหนดของคุณจะมีโหนดซีดีเท่านั้น หากในการสืบทอดของรูทโหนดมีทั้งโหนดหนังสือและซีดีชุดโหนดของคุณจะมีทั้งโหนดหนังสือและซีดี
เตฟาน

1
ใช่ฉันเข้าใจว่า "|" ผู้ประกอบการคือ คำถามแรกของฉันเกี่ยวกับตัวดำเนินการ OR ดังนั้นหากมีหนังสือ & ซีดีจะพบเฉพาะหนังสือหากไม่มีหนังสือ แต่ซีดีเท่านั้นมันจะค้นหาซีดี
user569008

19
@ user569008: |เป็นตัวดำเนินการชุดยูเนี่ยน

1
ดังนั้นไม่มีคำตอบสำหรับคำถามของฉัน / ไม่มีหรือผู้ประกอบการใน XPath สำหรับโหนด?
user569008

3
ตัวดำเนินการเชิงตรรกะ (OR, XOR และ AND) เหมือนกันในทุกภาษาการเขียนโปรแกรม แต่ภาษาธรรมชาติตีความต่างกันเล็กน้อย เป็นการดีที่สุดที่จะลบความคลุมเครือเมื่อพูดถึงปัญหาที่เกี่ยวข้องกับพวกเขา นอกจากนี้ยังมี XPath จะเป็นการดีที่สุดที่จะไม่คิดผลของคุณเป็นเป็นA หรือ Bแต่ว่ามันอาจจะตั้งอยู่ที่ริมหรือ ตรรกะวิธีก็อาจจะตั้งอยู่ที่ริมor Logical (eXclusive OR)หมายถึงสามารถหาได้ ตรรกะวิธีก็อาจจะตั้งอยู่ที่ริม a or b or bothxoreither a or b, but not bothandboth a and b
neXus

52

หากคุณต้องการเลือกเพียงหนึ่งในสองโหนดที่มีตัวดำเนินการร่วมคุณสามารถใช้โซลูชันนี้: (//bookstore/book/title | //bookstore/city/zipcode/title)[1]


จริงๆ(และ)[1]หมายถึงการเลือกเพียงหนึ่งในสอง?!?!
oldboy

@Anony ใช่มันจะเลือกหนึ่งในสองถ้ามีทั้งสองโหนดอยู่หรือจะเลือกเพียงอันเดียวที่มีอยู่
azurkin

โอเคฉันตีความคำสั่งของคุณผิด มันทำงานเหมือนตัวดำเนินการ "หรือ" อื่นใดดังนั้นหากเงื่อนไขแรกส่งกลับค่าจริงแล้วอันดับที่สองจะถูกข้ามใช่มั้ย
oldboy

@ แอนโทนี่ไม่มีเงื่อนไขที่นี่ มีโหนด และ "|" - เป็นผู้ประกอบการสหภาพโหนด มันสร้างโหนดชุดจากเส้นทางที่ระบุและไม่รับประกันลำดับโหนด หากโหนดที่มีพา ธ ที่ระบุไม่มีอยู่ก็จะหายไปในโหนดชุด จากนั้นสร้าง "[1]" รับโหนดแรกจาก nodeet
azurkin

จุดของฉันคือว่ามันทำงานคล้ายกับผู้ประกอบการorหรือในภาษาอื่น ๆ|ดังนั้นถ้าทั้งสองมีอยู่ก็จะกลับโหนดแรกเสมอ
oldboy

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.