XPath 1.0: возвращение строки из результатов нескольких узлов? - PullRequest
2 голосов
/ 18 октября 2011

Скажем, у меня есть структура узла, такая как:

<Row>
 <Column Name="Primary Number">1</Column>
 <Column Name="Secondary Number">01</Column>
 <Column Name="Text">This is all one sentence</Column>
<Row>
 <Column Name="Primary Number">1</Column>
 <Column Name="Secondary Number">02</Column>
 <Column Name="Text">I would like to return</Column>
<Row>
 <Column Name="Primary Number">1</Column>
 <Column Name="Secondary Number">03</Column>
 <Column Name="Text">as one string, in one xpath line</Column>

Прежде всего, я хотел бы сказать, что это не мой xml, и я не помогал в его построении. Но я вынужден использовать его для получения необходимой информации ... Так что, пожалуйста, помогите.

Итак, что я хотел бы сделать, используя один XPath, так это вернуть одну строку, содержащую текст из всех n числовых полей Text всех первичных номеров = 1 узла.
Возможно ли это с помощью XPath 1.0?

У меня есть не очень элегантное решение, но оно работает, только если я знаю точное число вторичных чисел, и тогда это просто куча грязных concat () ...

Привет всем, и спасибо всем за ответ! Итак, что я хотел сделать с этой строкой, так это использовать contains () для поиска определенных ключевых слов, но я обнаружил, что на самом деле есть комбинация строк со всеми значениями для этого, и мне просто нужно было поделиться ею на случай, если кто-то похожая проблема. Намек Тода очень помог с этим, я просто добавил к нему условность и магию БАМа. Вот оно:

Table[@Name='TableName']/Row/Column[@Name='Text' and contains(text(),"keyword")][preceding-sibling::Column[@Name='Primary Number' and text()='15']]

Таким образом, вместо того, чтобы объединить все значения узла, в виде одной строки, а затем с помощью метода содержит (), он ищет в каждой строке слово отдельно и, таким образом, устраняет необходимость невозможного. Спасибо за помощь, ребята, я не смог бы сделать это без всех замечательных ответов! (Я бы дал всем голоса "за", но я слишком новый :()

Ответы [ 2 ]

4 голосов
/ 18 октября 2011

Это делается в XPath 2.0 с помощью функции string-join (). Это можно сделать в XSLT 1.0, используя <xsl:for-each>. Но я не думаю, что это можно сделать в чистом XPath 1.0 без поддержки языка хоста.

1 голос
/ 18 октября 2011

Кажется, что это работает здесь:

//Row/Column[@Name="Text"][preceding-sibling::Column[@Name="Primary Number"]/text()="1"]

возвращает:

This is all one sentence
I would like to return
as one string, in one xpath line

Хотя я не уверен, что вы найдете новые строки в строке результата приемлемыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...