नीचे दिए गए एचटीएमएल में, मैं उन दो नोड्स को प्राप्त करने की कोशिश कर रहा हूं जिनमें shipment_number के मान हैं, लेकिन इसके बजाय मुझे 6 <td> नोड्स मिलते हैं - क्यों? क्या contains नोड्स को केवल टेक्स्ट वैल्यू से मेल खाने वाले नोड्स तक सीमित नहीं करता है? यदि ऐसा है तो नीचे दिया गया कथन केवल दो लौटाना चाहिए, छह नहीं?

क्रोम देव कंसोल में:

$x("//tr//td[contains(.,'shipment number')]/following::td[1]")

enter image description here

एचटीएमएल:

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    <table border="1">
        <tbody>
            <tr>
                <td>
                    <table>
                        <tbody>
                            <tr>
                                <td>
                                    <table>
                                        <tbody>
                                            <tr>
                                                <td>Date</td>
                                                <td>11/15/2019</td>
                                            </tr>
                                            <tr>
                                                <td>shipment number</td>
                                                <td>abc_123_florida-45</td>
                                            </tr>
                                            <tr>
                                                <td>Departure time:</td>
                                                <td>0430</td>
                                            </tr>
                                        </tbody>
                                    </table>
                                </td>
                                <td>
                                    <table>
                                        <tbody>
                                            <tr>
                                                <td>Time arrival</td>
                                                <td>1715</td>
                                            </tr>
                                            <tr>
                                                <td>customer</td>
                                                <td>bob smith</td>
                                            </tr>
                                            <tr>
                                                <td>box type</td>
                                                <td>square</td>
                                            </tr>
                                        </tbody>
                                    </table>
                                </td>
                            </tr>
                        </tbody>
                    </table>
                </td>
            </tr>

        </tbody>
    </table>
    <table border="1">
        <tbody>
            <tr>
                <td>
                    <table>
                        <tbody>
                            <tr name="laneStop">
                                <td>box1</td>
                                <td>23.45</td>
                                <td>lane1</td>
                                <td>south</td>
                            </tr>
                            <tr name="laneStop">
                                <td>box2</td>
                                <td>17.14</td>
                                <td>lane1</td>
                                <td>south</td>
                            </tr>
                            <tr name="laneStop">
                                <td>box3</td>
                                <td>17.18</td>
                                <td>lane1</td>
                                <td>north</td>
                            </tr>
                            <tr name="laneStop">
                                <td>box2</td>
                                <td>199.14</td>
                                <td>lane1</td>
                                <td>west</td>
                            </tr>
                        </tbody>
                    </table>
                </td>
            </tr>
        </tbody>
    </table>

    <table border="1">
        <tbody>
            <tr>
                <td>
                    <table>
                        <tbody>
                            <tr>
                                <td>
                                    <table>
                                        <tbody>
                                            <tr>
                                                <td>Date</td>
                                                <td>11/16/2019</td>
                                            </tr>
                                            <tr>
                                                <td>shipment number</td>
                                                <td>abc_222_florida-35</td>
                                            </tr>
                                            <tr>
                                                <td>Departure time:</td>
                                                <td>0630</td>
                                            </tr>
                                        </tbody>
                                    </table>
                                </td>
                                <td>
                                    <table>
                                        <tbody>
                                            <tr>
                                                <td>Time arrival</td>
                                                <td>1715</td>
                                            </tr>
                                            <tr>
                                                <td>customer</td>
                                                <td>sue smith</td>
                                            </tr>
                                            <tr>
                                                <td>box type</td>
                                                <td>rect</td>
                                            </tr>
                                        </tbody>
                                    </table>
                                </td>
                            </tr>
                        </tbody>
                    </table>
                </td>
            </tr>

        </tbody>
    </table>
    <table border="1">
        <tbody>
            <tr>
                <td>
                    <table>
                        <tbody>
                            <tr name="laneStop">
                                <td>box1</td>
                                <td>33.45</td>
                                <td>lane1</td>
                                <td>south</td>
                            </tr>
                            <tr name="laneStop">
                                <td>box2</td>
                                <td>1.14</td>
                                <td>lane1</td>
                                <td>south</td>
                            </tr>
                            <tr name="laneStop">
                                <td>box3</td>
                                <td>27.18</td>
                                <td>lane1</td>
                                <td>north</td>
                            </tr>
                            <tr name="laneStop">
                                <td>box2</td>
                                <td>299.14</td>
                                <td>lane1</td>
                                <td>west</td>
                            </tr>
                        </tbody>
                    </table>
                </td>
            </tr>
        </tbody>
    </table>
</body>
</html>
0
bitshift 22 जुलाई 2019, 18:51

2 जवाब

सबसे बढ़िया उत्तर

आप की जरूरत है

//tr//td[contains(text(),'shipment number')]/following::td[1] 

ऐसा इसलिए है क्योंकि contains(., '...') . को केवल बच्चों को ही नहीं, बल्कि इसके सभी टेक्स्ट वंशजों का विस्तार करके स्ट्रिंग में परिवर्तित करता है।

1
choroba 22 जुलाई 2019, 19:01

मैं यह उत्तर इसलिए जोड़ रहा हूं क्योंकि text() नोड परीक्षण अन्य आवश्यकताओं के साथ संघर्ष कर सकता है, मुख्य रूप से वे जो इनलाइन मार्कअप से संबंधित हैं।

आपको छह td तत्व मिलने का कारण यह है कि छह td "shipment number" हैं जो उनके स्ट्रिंग मान (सभी वंशज टेक्स्ट नोड्स का संयोजन) के हिस्से के रूप में हैं। और ऐसा इसलिए है क्योंकि आपके पास नेस्टेड टेबल हैं, इस प्रकार नेस्टेड td तत्व। तो, आप एक td तत्व चाहते हैं जिसमें वंशज td तत्व न हो।

इजहार:

//tr//td[not(.//td)][contains(.,'shipment number')]/following::td[1]

यह चुनता है:

<td>abc_123_florida-45</td>

<td>abc_222_florida-35</td>

चेक इन http://www.xpathtester.com/xpath/37bd889231ad68bb7bfa377433aeca00

ध्यान दें कि आपके इनपुट नमूने में नामस्थान URI http://www.w3.org/1999/xhtml के साथ एक डिफ़ॉल्ट नाम स्थान घोषणा है। क्योंकि न तो आपका कोड नमूना और न ही आपके चयनित उत्तर नामस्थान का उपयोग कर रहे हैं, मुझे लगता है कि आप उनके साथ काम करना जानते हैं।

0
Alejandro 22 जुलाई 2019, 23:35