0

在下面的 html 中,我试图获取包含 值的两个节点shipment_number,但我得到了 6<td>个节点 - 为什么?不contains将节点限制为仅与文本值匹配的节点吗?如果是这样,下面的语句应该只返回两个,而不是六个?

在 Chrome 开发控制台中:

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

在此处输入图像描述

html:

<!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>
4

2 回答 2

1

你需要

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

那是因为通过扩展其所有文本后代而不仅仅是子级来contains(., '...')转换为字符串。.

于 2019-07-22T16:01:14.150 回答
0

我添加这个答案是因为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。因为您的代码示例和您选择的答案都没有使用命名空间,所以我假设您知道如何使用它们。

于 2019-07-22T20:35:09.330 回答