<root>
<div>
<p>this text</p>
<p><span>fo</span><span>ob</span><span>ar</span></p>
</div>
<div>
<p>this text</p>
<p><span>fo</span><span>b</span><span>ar</span></p>
</div>
<div>
<p>this text</p>
<p><span>fooba</span><span>r</span></p>
</div>
<div>
<p><span>foo</span>this text<span>bar</span></p>
</div>
<div>
<p><span>foo</span><img/><span>bar</span></p>
</div>
<div>
<p><span>foo</span><span>bar</span><span>baz</span></p>
</div>
<div>
<p>foobar</p>
</div>
</root>
Given the above XML what XPath 1.0 query would select the <div>s based on foobar appearing within a single <span> or split across multiple consecutive <span>s?
- I only want to select the first and third
<div>. - The second
<div>containsfobar, notfoobar. - In the fourth
<div>the<span>s are not consecutive. - The fifth
<div>has an<img>between the<span>s so they're no longer consecutive. - The text of the sixth is
foobarbaz, notfoobar. - The seventh has the correct text but not within
<span>s.
I have tried using concat() but that doesn't work because I need to know the number of arguments first. Also, saying concat(//*, //*) is equivalent to concat(//*[1], //*[1]), which is not what I want.
This is within PHP so I only have XPath 1.0.
You can try this XPath :
Notice that
.returns concatenation of all text nodes within current context node.output in xpath tester :