Testing text() nodes vs string values in XPath

2018-12-31 14:25发布

问题:

I have a node as follows:

<span class=\"portal-text-medium\">Office Hours</span>

For the XPath I use

//span[text()=\'Office Hours\']

which should work, but it never does. I can use *contains(text(),\'Office Hours\')]* but that won\'t find an exact match and I have to verify there is no \"*\". This is not the only time it hasn\'t worked for me. I have seen it work before so I don\'t know what is wrong. Any idea?

Yes I can, and do, use starts-with but it is not quite the same.

回答1:

XPath text() = is different than XPath . =

(Matching text nodes is different than matching string values)

The following XPaths are not the same...

  1. //span[text() = \'Office Hours\']

    Says:

    Select the span elements that have an immediate child text node equal to \'Office Hours`.

  2. //span[. = \'Office Hours\']

    Says:

    Select the span elements whose string value is equal to \'Office Hours`.

In short, for element nodes:

The string-value of an element node is the concatenation of the string-values of all text node descendants of the element node in document order.

Examples

The following span elements would match only #1:

  • <span class=\"portal-text-medium\">Office Hours<br/>8:00-10:00</span>
  • <span class=\"portal-text-medium\">My<br/>Office Hours</span>

The following span elements would match only #2:

  • <span class=\"portal-text-medium\"><b>Office</b> Hours</span>
  • <span class=\"portal-text-medium\"><b><i>Office Hours</i></b></span>

The following span element would match both #1 and #2:

  • <span class=\"portal-text-medium\">Office Hours</span>


标签: html xml xpath