Вы ожидаете слишком многого от XPath 1.0. XPath 1.0, сам по себе, может помочь вам здесь выбрать
- строка или
- набор текстовых узлов
Затем вам придется завершить обработку за пределами XPath (как это предлагает Мадс в комментариях).
Чтобы понять ограничения, по которым вы бьете, ваш первый XPath,
//span[contains(@class, "container")]
выбирает набор узлов из span
элементов. Среда, в которой работает XPath 1.0, показывает вам (в некоторых вариациях) строковое значение единственного такого узла в вашем документе:
Peter: Lorem ImpsumPaul Smith: Foo Bar BAZMary: One Two Three
Но будьте осторожны: ваш XPath выбирает набор узлов из span
элементов, а не строк.
Ваш второй XPath,
//span[contains(@class, "container")]//text()
выбирает набор узлов из text()
узлов. Среда, в которой работает XPath 1.0, показывает строковое значение каждого выбранного узла text()
.
Если бы вы могли использовать XPath 2.0, вы могли бы напрямую, внутри XPath, выбрать последовательность строк,
//span[contains(@class, "container")]/text()/string()
или вы можете присоединиться к ним,
string-join(//span[contains(@class, "container")]/text(), "|")
и сразу получим
Peter: Lorem Impsum
|
Paul Smith: Foo Bar BAZ
|
Mary: One Two Three
или
string-join(//span[contains(@class, "container")]/text()/normalize-space(), "|")
чтобы получить
Peter: Lorem Impsum|Paul Smith: Foo Bar BAZ|Mary: One Two Three